2013-07-23 41 views
0

我最近想出了如何使用VB.Net将数据从SQL Server导出为XML。我用三个SQL语句和尺寸的XPath文档根标签添加到出口:VB.Net - 批量将XML插入到现有的SQL Server表

 Dim connectionString As String 
     Dim connection As New SqlConnection 
     Dim command As New SqlCommand() 

     Dim sql = "select * from scheduledata for xml auto, elements " & _ 
     "select * from costdata for xml auto, elements " & _ 
     "select * from csintegrationdata for xml auto, elements " 

     connectionString = "Data Source=(localdb)\v11.0; _ 
     Initial Catalog=localACETest;Integrated Security=True" 
     connection = New SqlConnection(connectionString) 
     connection.Open() 

     command.CommandText = sql 
     command.Connection = connection 
     command.CommandType = CommandType.Text 

     Dim xmlRead As XmlReader = command.ExecuteXmlReader() 

     Dim xp As New XPath.XPathDocument(xmlRead) 
     Dim xn As XPath.XPathNavigator = xp.CreateNavigator() 
     Dim xd As New XmlDocument 
     Dim root As XmlNode = xd.CreateElement("Data") 
     root.InnerXml = xn.OuterXml 
     xd.AppendChild(root) 

     Dim fStream As New FileStream(Directory, FileMode.Create, FileAccess.ReadWrite) 

     xd.Save(fStream) 
     fStream.Close() 

我希望能够将此数据重新导入到使用VB的SQL表,但我有有些麻烦。我正在使用的代码是这样的:

 Using sqlconn As New SqlConnection(connectionString) 
      Dim ds As New DataSet() 
      Dim sourcedata As New DataTable() 
      Dim ii As Integer = 0 
      ds.ReadXml("C:\Users\coopere.COOPERE-PC\Desktop\Test.xml") 
      sqlconn.Open() 

      Using bulkcopy As New SqlBulkCopy(sqlconn) 
       sourcedata = ds.Tables(0) 

       bulkcopy.DestinationTableName = "CSIntegrationData" 
       bulkcopy.ColumnMappings.Add("Period", "Period") 
       bulkcopy.ColumnMappings.Add("Program", "Program") 
       bulkcopy.ColumnMappings.Add("CostControlAccount", "CostControlAccount") 
       ... 

       bulkcopy.WriteToServer(sourcedata) 
      End Using 
      sqlconn.Close() 
     End Using 

做这件事时,我得到一个错误信息:System.InvalidOperationException:给定的ColumnName“CostControlAccount”不与数据源的任何列匹配。

我相信这样做的原因是因为导出到XML的表格中有一列填满了NULL值,这些值不会在XML中的任何位置上结束。但情况并非总是如此 - 通常情况下,会有价值。

考虑到SqlBulkCopy的列映射无法处理接受空值,我如何在我的导出/导入中处理空值?我也完全开放给不同的路线。

回答

1

经过大量的挖掘,我发现this link

作为FOR XML函数的一部分,您可以在末尾使用XSINIL来处理空值。结果XML如下。

select * from TABLENAME for xml auto, elements XSINIL 

<ScheduleWorkPackage xsi:nil="true" />