Возможно ли сразу вставить весь VB.NET DataTable в SQL Server

У меня есть 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 и отсортировать его и вставить строки?

Ответ 2

С 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()

Ответ 3

Используйте 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")

Ответ 4

Вы можете вызвать .WriteXML() в DataSet и выгрузить его в базу данных в одной вставке.

Ответ 5

Более простой способ - использовать настольный адаптер. Затем вы можете использовать метод 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" и правильно установить строку подключения...