.NET datatable a SQL Server stored procedure come XML
-
05-07-2019 - |
Domanda
Ok. Quindi sono abbastanza nuovo per questo. Ho un datatable che voglio passare a una stored procedure per ulteriore manipolazione. Ho letto alcune cose sul web e sembra che dovrei essere in grado di convertire il datatable in XML e quindi passarlo alla procedura memorizzata. Cosa sto sbagliando? Ho SQL Server 2005. I dati non vengono mai passati alla procedura memorizzata.
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
La procedura memorizzata è simile a questa ...
ALTER PROCEDURE [dbo].[ProcessFile]
(
@x XML
)
AS
BEGIN
'DO STUFF HERE
END
Soluzione 2
OK. Questo è quello che vado a lavorare. Non so se questo è il modo migliore, ma questo funziona per me.
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
La procedura memorizzata si presenta così.
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
Altri suggerimenti
In passato ho fatto qualcosa di simile ma con SQL 2000. In SQL 2000 non esisteva un tipo di dati XML, quindi ho dovuto ricevere l'output da DataSet.GetXML tramite un parametro ntext nella procedura memorizzata, quindi elaborarlo utilizzando sp_xml_preparedocument e sp_xml_removedocument, quindi il processo dovrebbe funzionare per te.
Potrebbe non essere necessario caricare un documento Xml con il testo e passare semplicemente il testo xml così com'è alla procedura memorizzata.