Pregunta

Ok. Así que soy bastante nuevo a esto. Tengo un datatable que quiero pasar a un procedimiento almacenado para su posterior manipulación. He leído algunas cosas en la web y parece que debería poder convertir los datos a XML y luego pasarlos al procedimiento almacenado. ¿Qué estoy haciendo mal? Tengo SQL Server 2005. Los datos nunca se pasan al procedimiento almacenado.

Sub Test()
    Dim dt As New DataTable

    Fill datatable code omitted. there are 150 rows in the datatable after this

    Dim ds As New DataSet
    ds.Tables.Add(dt)
    Dim x As XmlDocument
    x.LoadXml(dt.DataSet.GetXml)
    Dim ta As New dsTestTableAdapters.TESTRxTableAdapter
    ta.ProcessFile(x)
End Sub

El procedimiento almacenado tiene este aspecto ...

ALTER PROCEDURE [dbo].[ProcessFile]

    (
         @x XML

    )
AS
BEGIN

'DO STUFF HERE

END
¿Fue útil?

Solución 2

OK. Esto es lo que voy a trabajar. No sé si esta es la mejor manera, pero esto funciona para mí.

Sub Test
    Dim ds as new DataSet ("Testds")
    Dim dt as New DataTable("Testdt")
    'Fill Datatable code omitted

Dim ta as new dsTest.TestTableAdapter
    'TableAdapter returns a datatable to ensure that the stored procedure worked
    ta.AddDataToDB(dt,ds.GetXML)

    Me.DataGridView1.DataSource=dt
    End Sub

El procedimiento almacenado tiene este aspecto.

CREATE PROCEDURE [dbo].[AddDataToDB]

    (
         @x XML

    )
AS
    BEGIN
        DECLARE @data TABLE (
                            TestCol1 VARCHAR(50),
                            [TestCol2] VARCHAR(50), 
                            [TestCol3] VARCHAR(50), 
                            )

        INSERT INTO @data (
                           [TestCol1],
                           [TestCol2],
                           [TestCol3]
                          )
        SELECT 
            xmlVals.rowvals.query('TestCol1').value('.','VARCHAR(50)'),
            xmlVals.rowvals.query('TestCol2').value('.','VARCHAR(50)'),
            xmlVals.rowvals.query('TestCol3').value('.','VARCHAR(50)')
        FROM 
            @x.nodes('/Testds/Testdt') as xmlVals(rowvals)



        SELECT * FROM @data     

    END

Otros consejos

En el pasado he hecho algo similar pero con SQL 2000. En SQL 2000 no había ningún tipo de datos XML, así que tuve que recibir la salida de DataSet.GetXML a través de un parámetro ntext en el procedimiento almacenado y luego lo procesé utilizando sp_xml_preparedocument y sp_xml_removedocument, por lo que el proceso debería funcionar para usted.

Es posible que no necesite cargar un XmlDocument con el texto y que solo pueda pasar el texto xml tal como está al procedimiento almacenado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top