2013-07-23 2 views
0

VB.Net을 사용하여 SQL Server에서 XML로 데이터를 내보내는 방법을 최근에 알아 냈습니다. 나는 3 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 테이블에 데이터를 가져 오기를 다시 할 수 있도록,하지만 난 데 약간의 문제. 내가 사용하는 코드는 이것이다 : System.InvalidOperationException :

 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 

이 일을, 내가 오류가 주어진의 ColumnName 'CostControlAccount는'데이터 소스의 모든 열이 일치하지 않습니다.

XML에 내 보낸 테이블 중 하나에 XML의 아무 곳에서나 감겨지지 않는 NULL 값으로 가득 찬 열이 있기 때문입니다. 하지만 항상 그런 것은 아닙니다. 종종 가치가있을 것입니다.

SqlBulkCopy의 열 매핑이 null 값 허용을 처리 할 수 ​​없다는 것을 고려하면 내 내보내기/가져 오기에서 null 값을 어떻게 처리 할 수 ​​있습니까? 나는 또한 다른 길을 완전히 열었습니다.

답변

1

많은 파기 후에, 나는 this link을 발견했다.

FOR XML 함수의 일부로 null 값을 처리하기 위해 XSINIL을 붙일 수 있습니다. 결과 XML은 다음과 같습니다.

select * from TABLENAME for xml auto, elements XSINIL 

<ScheduleWorkPackage xsi:nil="true" /> 
관련 문제