web-dev-qa-db-ja.com

VB.NETDataTable全体をSQLServerに一度に挿入することは可能ですか?

VB.NETにSQLClient.DataSetがあり、次の操作を行わずにすべてをSQLServerテーブルに挿入したいと思います。

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

私は100万行に近いので(すべてかなり細いので、スペースはあまりありません)、明らかにこのループを実行して100万のINSERTステートメントを生成したくありません。

データは別のSQLServerからのものであるため、最初にデータをフェッチするときにリンクサーバーを使用し、そこからINSERTにデータを送信するという選択肢があることを私は知っています。ただし、アプリケーションにすでにデータがある場合、それを一括挿入するためのより効率的な方法はありますか?どういうわけか、DataTableをパラメーターとしてSQL Serverに渡し、それを並べ替えて行を挿入することはできますか?

10
SqlRyan

SqlBulkCopy で試してください

16
anishMarokey

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()
7
Remus Rusanu

SqlDataAdapter のInsertCommandを使用して、挿入クエリを定義します。次に、データセットをパラメーターとして使用してDataAdapterのUpdateメソッドを呼び出し、データをプッシュします。

何かのようなもの:

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")
3
C-Pound Guru

DataSetで.WriteXML()を呼び出し、それを1回の挿入でデータベースにダンプできます。

2
CSharpAtl

より簡単な方法は、テーブルアダプタを使用することです。次に、Fillメソッドを使用して、データテーブルを引数として指定できます。

    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

データベースの「出力ディレクトリにコピー」プロパティを「ネットコピーを実行」に変更し、接続文字列を適切に設定することを忘れないでください...

0