2009-05-15 20 views
5

Mi script:¿Cómo recuperar datos XML de 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) 

que puede ejecutar el script y puedo ver la consulta ejecutar en mi instancia del servidor SQL, pero nada se volvió a la corriente de salida.

+0

Como lo señala Jose, su instrucción SQL no recupera la información en forma de un XML. es decir, no está utilizando FOR XML – shahkalpesh

Respuesta

5

Para recuperar los resultados en una secuencia, la consulta debe incluir "FOR XML AUTO". También cambiar la adExecuteStream texto al valor constante de 1024.

Código 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) 

Si usted no necesita una corriente y en su lugar desea leer los valores de itemsgt y el tema, intente esto en su lugar:

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

La razón por la que quiero una transmisión es que estoy tomando la salida y enviándola a un mensaje de cola de mensajes. Mi script original usó la convención que indicaste para XML AUTO y no funcionó, pensé que estaba simplificando las cosas al eliminar el formato XML del problema. Probaré tu conjunto de registros sugerido solo para probarme a mí mismo que puedo recuperar algo. –

+0

Acabo de actualizar mi publicación. Una parte del XML AUTO faltante, el otro problema era la línea con myCommand.Execute ,, adExecuteStream - cámbialo a 1024 y funcionará. –

+0

Muchas gracias, funciona bien con los cambios recomendados. –

Cuestiones relacionadas