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に渡し、それを並べ替えて行を挿入することはできますか?
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を使用して、挿入クエリを定義します。次に、データセットをパラメーターとして使用して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")
DataSetで.WriteXML()
を呼び出し、それを1回の挿入でデータベースにダンプできます。
より簡単な方法は、テーブルアダプタを使用することです。次に、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
データベースの「出力ディレクトリにコピー」プロパティを「ネットコピーを実行」に変更し、接続文字列を適切に設定することを忘れないでください...