2009-05-15 2 views
5

내 스크립트를SQL Server 2005에서 XML 데이터를 검색하는 방법은 무엇입니까?

Dim myStream, myConnection, myCommand 
Set myStream = CreateObject("ADODB.Stream") 
Set myConnection = CreateObject("ADODB.Connection") 
Set myCommand = CreateObject("ADODB.Command") 
' 
myConnection.Open "Provider=SQLOLEDB;Integrated Security=SSPI;" & _ 
"Persist Security Info=False;Initial Catalog=DSIPAR;Data Source=.\DSIDATA" 

myCommand.ActiveConnection = myConnection 

myCommand.CommandText = "SELECT itemsgt, item FROM NIFItem" 

myStream.Open 

myCommand.Properties("Output Stream") = myStream 
myCommand.Execute , , adExecuteStream 

myStream.Position = 0 
myStream.Charset = "ISO-8859-1" 

Dim strxml 
strxml = myStream.ReadText 
MsgBox (strxml) 

나는 스크립트를 실행할 수 있습니다 내가 쿼리 내 SQL 서버 인스턴스에서 실행 볼 수 있지만 아무것도 이제까지 출력 스트림에 반환되지 않습니다.

+0

호세가 지적한 것처럼 SQL 문은 정보를 XML 형식으로 검색하지 않습니다. 즉 FOR XML을 사용하고 있지 않습니다. – shahkalpesh

답변

5

결과를 스트림으로 검색하려면 쿼리에 "FOR XML AUTO"가 포함되어야합니다. 또한 1024

전체 코드 상수 값으로 텍스트 adExecuteStream을 변경

Dim myStream, myConnection, myCommand 
Set myStream = CreateObject("ADODB.Stream") 
Set myConnection = CreateObject("ADODB.Connection") 
Set myCommand = CreateObject("ADODB.Command") 
myConnection.Open "Provider=SQLOLEDB;Integrated Security=SSPI;" & _ 
"Persist Security Info=False;Initial Catalog=DSIPAR;Data Source=.\DSIDATA" 
myCommand.ActiveConnection=myConnection 

myCommand.CommandText="SELECT itemsgt,item FROM NIFItem FOR XML AUTO" 

myStream.Open 
myCommand.Properties("Output Stream") = myStream 
myCommand.Properties("xml root") = "root" 

myCommand.Execute ,,1024 'instead of adExecuteStream 
myStream.Position=0 
myStream.Charset="ISO-8859-1" 
Dim strxml 
strxml = myStream.ReadText 
MsgBox (strxml) 

당신이 스트림을 필요로하고 대신 itemsgt 및 항목의 값을 읽을 수 없다 않으면 다음을 시도

Dim myStream, myConnection, myCommand, adoRec 
Set myStream = CreateObject("ADODB.Stream") 
Set myConnection = CreateObject("ADODB.Connection") 
Set myCommand = CreateObject("ADODB.Command") 
myConnection.Open "Provider=SQLOLEDB;Integrated Security=SSPI;" & _ 
"Persist Security Info=False;Initial Catalog=DSIPAR;Data Source=.\DSIDATA" 
myCommand.ActiveConnection=myConnection 
myCommand.CommandText="SELECT itemsgt,item FROM NIFItem" 
SET adoRec = myCommand.Execute() 
'Get the first results 
If Not adoRec.EOF then 
    MsgBox "itemsgt = " & adoRec(0) & vbcrlf & "item=" & adoRec(1) 
End If 

'Iterate through the results 
While Not adoRec.EOF 
    itemsgt = adoRec(0) 
    item = adoRec(1) 
    'MsgBox "itemsgt = " & itemsgt & vbcrlf & "item=" & item 
    adoRec.MoveNext 
Wend 
+0

스트림을 원한다는 이유는 출력을 가져 와서 메시지 큐 메시지로 보내는 것입니다. 원본 스크립트에서 XML AUTO로 지정한 규칙을 사용했지만 작동하지 않으면 XML 형식을 제거하여 문제를 단순화 할 수 있다고 생각했습니다. 나는 제안 된 레코드 세트를 시험해보고 나 자신에게 뭔가를 얻을 수 있다고 증명할 것이다. –

+0

방금 ​​내 게시물을 업데이트했습니다. XML AUTO에서 일부가 누락되었습니다. 다른 문제는 myCommand.Execute, adExecuteStream과 같습니다. 1024로 변경하면 제대로 작동합니다. –

+0

많은 분들께 감사드립니다. –

관련 문제