2009-01-08 25 views
0

好的。所以我很新。我有一个数据表,我想传递给存储过程进行进一步操作。我已经阅读了网上的一些东西,看起来我应该能够将数据表转换为XML,然后将其传递给存储过程。我错了什么?我有SQL服务器2005.数据永远不会传递给存储过程。.NET数据表以SQL Server存储过程为XML

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 

存储过程是这样的......

ALTER PROCEDURE [dbo].[ProcessFile] 

    (
     @x XML 

    ) 
AS 
BEGIN 

'DO STUFF HERE 

END 
+0

dsTestTableAdapters.TESTRxTableAdapter中发生了什么? – edosoft 2009-01-08 15:47:04

回答

1

好的。这就是我去工作。我不知道这是否是最好的方式,但这对我有用。

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 

存储过程看起来像这样。

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 
1

在过去,我已经做了类似的,但与2000年的SQL东西在SQL 2000没有XML数据类型,所以我不得不接受DataSet.GetXML通过ntext参数输出到存储过程,然后使用sp_xml_preparedocument和sp_xml_removedocument处理它,因此该过程应该适合您。

这可能是因为您不需要加载带有文本的XmlDocument,只需将xml文本原样传递给存储过程即可。