Можно ли сразу вставить всю таблицу данных VB.NET в SQL Server - PullRequest
10 голосов
/ 07 октября 2009

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

Ответы [ 5 ]

16 голосов
/ 07 октября 2009

попробуй с SqlBulkCopy

7 голосов
/ 07 октября 2009

В 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 голосов
/ 07 октября 2009

Используйте команду InsertCommand SqlDataAdapter для определения запроса вставки. Затем вызовите метод обновления 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")
2 голосов
/ 07 октября 2009

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

0 голосов
/ 30 апреля 2019

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

Не забудьте изменить свойство базы данных «Копировать в выходной каталог» на «Делать сетевое копирование» и правильно настроить строку подключения ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...