2015-08-03 1 views
1

Это делает мою кору в ... Работаю в VB.net 2010 и 2013 годах. У меня есть данные, которые создаются «на лету» и Я хочу как можно быстрее поместить указанные данные в таблицу в моей базе данных SQL Server. В настоящее время единственное, что я могу получить, это «вставить в ...» для каждой строки в datatable, создав sql для вставки каждого значения в каждое поле. Я бы хотел, чтобы для SqlServer.datatable = onTheFlyDataTable.VB.Net SQL Server копирует данные из базы данных «на лету» в базу данных

Я пробовал ряд за строкой, но я не могу заставить это работать, поскольку SQL, который я использую для моей таблицы серверов, является «SELECT * FROM ...», который явно доступен только для чтения.

То, что я действительно запускал без ошибок, было чем-то вроде этого, но никогда не записывало данные обратно в базу данных SQL Server. Я бежал без ошибок, а dtTEST в конце этого сделал, содержащий все строки, которые я добавил - он просто не записывал его обратно в базу данных. Даже попытался .AcceptChanges ...

Dim sSYSsqlTEST As String = "SELECT * FROM MyDataBaseTable;" 
Debug.Print(sSYSsqlTEST) 

Dim cmdTEST As SqlCommand = New SqlCommand(sSYSsqlTEST, cNN) 
Dim daTEST As SqlDataAdapter = New SqlDataAdapter(cmdTEST) 
Dim dsTEST As DataSet = New DataSet 
If Not IsNothing(daTEST) Then 
    daTEST.Fill(dsTEST, "TEST") 
End If 
Dim dtTEST As DataTable = dsTEST.Tables("TEST") 


For each dr as datarow in myOnTheFlyDataTable 
    Dim workRow As DataRow = workTable.NewRow() 
    workRow = dr 
    workTable.Rows.Add (workRow) 
Next 

Является ли то, что я пытаюсь сделать достижимым?

На основании ответа Прадипом, я уже изменил к этому, но я получаю «Данный ColumnMapping не совпадает с какой-либо столбца в источнике или назначения. »

Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(cNN) 
bulkCopy.DestinationTableName = "dbo." + sCUSTOMER + "_IMPORT" 
With bulkCopy.ColumnMappings 
    For x As Integer = 0 To iNOfields 
    Debug.Print("Column " + x.ToString + " Datatype = " + dtIMPORT.Columns(x).DataType.ToString) 
    .Add(dtIMPORT.Columns(x).ColumnName, "[FIELD " + x.ToString + "]") 
    Next 
End With 
Try 
    ' Write from the source to the destination. 
    bulkCopy.WriteToServer(dtIMPORT) 
Catch ex As Exception 
    Debug.Print(ex.Message) 
    Debug.Print("") 
End Try 

End Using 

ответ

1

Если все, что вы хотите, передача ваш DataTable в базу данных, а затем используйте класс SqlBulkCopy. Вы достигнете гораздо лучшей производительности.

Обратите внимание, что структуры таблиц должны быть одинаковыми.

Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(yourConnection) 
    bulkCopy.DestinationTableName = "dbo.YourDataBaseTable" 
    With bulkCopy.ColumnMappings 
     .Add("srcColumn1", "destColumn1") 
     .Add("srcColumn2", "destColumn2") 
     '-- and so on ... 

    End With 
    Try 
     ' Write from the source to the destination. 
     bulkCopy.WriteToServer (myOnTheFlyDataTable) 

    Catch ex As Exception 
     Console.WriteLine(ex.Message) 
    End Try 
End Using 
+0

Thanks Pradeep. Я думаю, что моя проблема в том, что не все типы полей совпадают: в System.Data.dll произошла первая случайная ошибка типа «System.InvalidOperationException». Данные ColumnMapping не соответствуют ни одному столбцу источника или адресата. Этот coulod будет проблемой, так как на лету, который вылетает на лету, берется из электронной таблицы, которая может устанавливать число как число, где некоторые из них в моей таблице являются varchar (250). Я могу заставить заставить excel читать делать строки, но не надеяться на это. Есть ли другой способ делать строки за строкой, если это не сработает? – Tym

+0

Да, если определения столбцов не совпадают, вы можете указать информацию сопоставления столбцов в свойстве 'ColumnMappings'. –

+0

Я обновил код выше, чтобы показать, как можно сопоставить информацию о сопоставлении столбцов. НТН. –

Смежные вопросы