[ADO.NET] DataAdapter によるバッチ更新の実行:ADO.NET2.0
http://msdn2.microsoft.com/ja-jp/library/kbbwt18a.aspx
DataAdapter によるバッチ更新の実行
以前のバージョンの ADO.NET では、DataSet に格納されている変更内容をデータベースに反映する場合、DataAdapter の Update メソッドを実行して、1 行ずつデータベースを更新していました。このメソッドは、指定された DataTable 内の行を反復処理すると、各 DataRow を調べ、行が変更されたことを確認します。行が変更されている場合、その行の RowState プロパティの値に基づいて、適切な UpdateCommand、InsertCommand、または DeleteCommand のいずれかを呼び出します。各行の更新では、データベースへのネットワーク ラウンドトリップが発生します。
ADO.NET 2.0 では、UpdateBatchSize プロパティが DataAdapter によって公開されます。UpdateBatchSize を正の整数値に設定すると、データベースの更新が指定されたサイズのバッチとして送信されます。たとえば、UpdateBatchSize を 10 に設定すると、10 個の個別のステートメントがグループ化され、単一のバッチとして送信されます。UpdateBatchSize を 0 に設定すると、DataAdapter は、サーバーが処理できる最大のバッチ サイズを使用します。1 に設定すると、バッチ更新が無効になり、1 行ずつ送信されます。
サイズの大きいバッチを実行すると、パフォーマンスが低下する可能性があります。そのため、アプリケーションを実装する前に、バッチの最適なサイズ設定をテストする必要があります。
UpdateBatchSize プロパティの使用
バッチ更新を有効にする場合、DataAdapter の UpdateCommand、InsertCommand および DeleteCommand の UpdatedRowSource プロパティ値を、None または OutputParameters に設定する必要があります。バッチ更新を実行する際、FirstReturnedRecord または Both のコマンドの UpdatedRowSource プロパティ値は、無効になります。
UpdateBatchSize プロパティを使用するプロシージャを次に示します。このプロシージャは、2 つの引数を取ります。1 つは、Production.ProductCategory テーブル内の ProductCategoryID フィールドおよび Name フィールドを表す列を持つ DataSet オブジェクトで、もう 1 つは、バッチ サイズ (バッチ ファイル内の行数) を表す整数です。このコードにより、新しい SqlDataAdapter オブジェクトが作成され、その UpdateCommand、InsertCommand プロパティおよび DeleteCommand プロパティが設定されます。このコードは、DataSet オブジェクトによって行が変更済みになっていることを前提としています。このオブジェクトは、UpdateBatchSize プロパティを設定し、更新を実行します。
{C#}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
public static void BatchUpdate(DataTable dataTable,Int32 batchSize) { // Assumes GetConnectionString() returns a valid connection string. string connectionString = GetConnectionString(); // Connect to the AdventureWorks database. using (SqlConnection connection = new SqlConnection(connectionString)) { // Create a SqlDataAdapter. SqlDataAdapter adapter = new SqlDataAdapter(); // Set the UPDATE command and parameters. adapter.UpdateCommand = new SqlCommand( "UPDATE Production.ProductCategory SET " + "Name=@Name WHERE ProductCategoryID=@ProdCatID;", connection); adapter.UpdateCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name"); adapter.UpdateCommand.Parameters.Add("@ProdCatID", SqlDbType.Int, 4, "ProductCategoryID"); adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; // Set the INSERT command and parameter. adapter.InsertCommand = new SqlCommand( "INSERT INTO Production.ProductCategory (Name) VALUES (@Name);", connection); adapter.InsertCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name"); adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None; // Set the DELETE command and parameter. adapter.DeleteCommand = new SqlCommand( "DELETE FROM Production.ProductCategory " + "WHERE ProductCategoryID=@ProdCatID;", connection); adapter.DeleteCommand.Parameters.Add("@ProdCatID", SqlDbType.Int, 4, "ProductCategoryID"); adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None; // Set the batch size. adapter.UpdateBatchSize = batchSize; // Execute the update. adapter.Update(dataTable); } } |
コメントはまだありません。