2009-05-15 21 views
5

Il mio script:Come recuperare i dati XML da SQL Server 2005?

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) 

posso eseguire lo script e posso vedere la query eseguire sul mio istanza del server SQL, ma nulla è mai tornato nel flusso di output.

+0

Come sottolineato da Jose, l'istruzione SQL non recupera le informazioni sotto forma di XML. Ad esempio, non utilizza FOR XML – shahkalpesh

risposta

5

Per recuperare i risultati in uno stream, la query deve includere "FOR XML AUTO". cambiarne anche l'adExecuteStream testo per il valore della costante 1024.

codice completo:

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) 

Se non avete bisogno di un ruscello e invece volete leggere i valori di itemsgt e la voce, provate questo invece:

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

Il motivo per cui desidero un flusso è che sto prendendo l'output e inviandolo a un messaggio di coda dei messaggi. Il mio script originale usava la convenzione che hai indicato per XML AUTO e non funzionava, pensavo di semplificare le cose rimuovendo la formattazione XML dal problema. Proverò il tuo recordset suggerito solo per dimostrare a me stesso che posso ottenere qualcosa in cambio. –

+0

Ho appena aggiornato il mio post. Una parte di XML AUTO mancante, l'altro problema era in linea con myCommand.Execute ,, adExecuteStream - cambia in 1024 e funzionerà. –

+0

Molte grazie, funziona bene con le modifiche consigliate. –

Problemi correlati