Ответ 1
попробуйте SqlBulkCopy
У меня есть SQLClient.DataSet в VB.NET, и я хочу вставить всю вещь в таблицу SQL Server без необходимости делать следующее:
For Each dr as Datarow in MyDataset
Dim sc As New SqlCommand("INSERT INTO MyNewTable " & _
"VALUES (@column1, @column2)", MyDBConnection)
sc.Parameters.AddWithValue("@column1", dr.Item(0))
sc.Parameters.AddWithValue("@column2", dr.Item(1))
sc.ExecuteNonQuery()
Next
Поскольку у меня близко к миллиону строк (все довольно тощие, поэтому это не так много места), я, очевидно, не хочу запускать этот цикл и генерировать миллионы инструкций INSERT.
Я знаю, что один из вариантов заключается в использовании связанного сервера, когда я изначально извлекаю данные, так как он поступает с другого SQL Server, и просто получаю его от INSERT. Однако, если у меня уже есть данные в моем приложении, есть ли более эффективный способ вставки вставки? Могу ли я каким-то образом передать DataTable в качестве параметра SQL Server и отсортировать его и вставить строки?
попробуйте SqlBulkCopy
С SQL Server 2008 вы можете использовать Табличные параметры:
Dim sc As New SqlCommand(
"INSERT INTO MyNewTable (field1, field2,...)"&
"SELECT field1, field2,... FROM @MyTable;", MyDBConnection)
sc.Parameters.AddWithValue("@MyTable", MyDataset)
sc.ExecuteNonQuery()
Используйте SqlDataAdapter InsertCommand, чтобы определить запрос Insert. Затем вызовите метод обновления DataAdapter с вашим набором данных в качестве параметра, чтобы он мог нажимать данные.
Что-то вроде:
Dim DA As SqlDataAdapter = New SqlDataAdapter
Dim Parm As New SqlParameter
DA.InsertCommand = New SqlCommand("Insert Into tbl1(fld0, fld1, fld2) Values(@fld0, @fld1, @fld2)", conn)
Parm = DA.InsertCommand.Parameters.Add(New SqlParameter ("@fld0", NVarChar, 50, "fld0"))
Parm = sqlDA.InsertCommand.Parameters.Add(New SqlParameter ("@fld1", SqlDbType.NVarChar, 50, "fld1"))
Parm = sqlDA.InsertCommand.Parameters.Add(New SqlParameter ("@fld2", SqlDbType.NVarChar, 50, "fld2"))
DA.Update(dataset1, "tbl1")
Вы можете вызвать .WriteXML()
в DataSet и выгрузить его в базу данных в одной вставке.
Более простой способ - использовать настольный адаптер. Затем вы можете использовать метод Fill, чтобы задать datatable в качестве аргумента:
Dim oStronglyTypedTable As StronglyTypedDataTable = GetTable() 'A custom function that creates your table from wherever you want)
If Not oStronglyTypedTable Is Nothing Then
Using oAdapter As New StronglyTypedTableAdapter
Dim res As Integer = oAdapter.Update(oStronglyTypedTable)
MsgBox(res & " rows have been updated.")
End Using
End If
Не забудьте изменить свойство базы данных "Копировать в выходной каталог" на "Do net copy" и правильно установить строку подключения...