2013-07-16 2 views
1

У меня есть SQL-база данных, из которой я экспортирую данные в формате XML с помощью кода VB.Net. Код относительно прост, работает быстро и отлично форматирует 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

Вот способ автоматизировать отображение столбцов ... это предполагает, что существует таблица с такой же структурой, в целевой базе данных. Cheers :-)

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