2013-07-16 71 views
1

我有一個SQL DB,使用VB.Net代碼將數據導出爲XML。代碼相對簡單,工作迅速,格式化XML很精美。該代碼是:SQLXML導入/導出

Dim connetionString As String 
    Dim connection As SqlConnection 
    Dim adapter As SqlDataAdapter 
    Dim ds As New DataSet 
    Dim sql As String 

    connetionString = "Data Source=(localdb)\v11.0;Initial Catalog=localACETest;Integrated Security=True" 
    connection = New SqlConnection(connetionString) 
    sql = "select * from costdata" 
    Try 
     connection.Open() 
     adapter = New SqlDataAdapter(sql, connection) 
     adapter.Fill(ds) 
     connection.Close() 
     ds.WriteXml("C:\Users\coopere.COOPERE-PC\Desktop\Test.xml") 
     MsgBox("Done") 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 

我在加載該數據早在這個問題現在看來似乎應該是作爲上述那樣容易,但我似乎無法得到一個簡單的方法來做到這一點。 。

這是我的理解,我可以使用XMLReader耦合ADO.NET,但在這種情況下,我需要定義DataTable的列插入XML數據之前,我將它全部導入到數據庫中。

有什麼辦法可以避免在DataTable中對列值進行硬編碼,並且導出的XML數據以類似於上面的方式導入?

回答

0

雖然它不是按列名自動執行的,但我決定對映射進行硬編碼並不是太麻煩。然而,我都是自動化的方式。我的解決辦法:

Dim connectionString As String = "Data Source=(localdb)\v11.0;Initial Catalog=localACETest;Integrated Security=True" 
    Try 
     Using sqlconn As New SqlConnection(connectionString) 
      Dim ds As New DataSet() 
      Dim sourcedata As New DataTable() 
      ds.ReadXml("C:\Users\coopere.COOPERE-PC\Desktop\Test.xml") 
      sourcedata = ds.Tables(0) 
      sqlconn.Open() 
      Using bulkcopy As New SqlBulkCopy(sqlconn) 
       bulkcopy.DestinationTableName = "ScheduleData" 
       bulkcopy.ColumnMappings.Add("Id", "Id") 
       bulkcopy.ColumnMappings.Add("Period", "Period") 
       ... 

       bulkcopy.WriteToServer(sourcedata) 
      End Using 
      sqlconn.Close() 
     End Using 
     MsgBox("Done") 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
0

這裏是自動列映射的方式......它採用表與目標數據庫相同的結構存在。歡呼聲:-)

Public Shared Function BulkCopyXML(_ 
      path_ As String, _ 
      connection_string_ As String, _ 
      messages_ As List(Of String), _ 
      exceptions_ As List(Of Exception) _ 
    ) As Boolean 
    Dim result_ As Boolean = False 
    Try 

     Dim dataset_ As New DataSet() 
     dataset_.ReadXml(path_) 
     Dim datatable_ As DataTable = Nothing 

     Using connection_ As SqlClient.SqlConnection = New SqlClient.SqlConnection(connection_string_) 
      connection_.Open() 
      Using bulkCopy_ As SqlClient.SqlBulkCopy = New SqlClient.SqlBulkCopy(connection_) 
       For Each datatable_ In dataset_.Tables() 
        messages_.Add(datatable_.TableName) 
        bulkCopy_.DestinationTableName = datatable_.TableName 
        bulkCopy_.ColumnMappings.Clear() 
        For Each dataColumn_ As DataColumn In datatable_.Columns 
         bulkCopy_.ColumnMappings.Add(dataColumn_.ColumnName, dataColumn_.ColumnName) 
        Next 
        bulkCopy_.WriteToServer(datatable_) 
       Next 
      End Using 
     End Using 

     result_ = True 
    Catch exception_ As Exception 
     If exceptions_ Is Nothing Then 
      Throw exception_ 
     Else 
      exceptions_.Add(exception_) 
     End If 
    Finally 

    End Try 
    Return result_ 
End Function