SqlDataAdapter.Update を DataTables と共に使用して、1 つのトランザクションで 2 つの SQL テーブルを更新しています。いずれかの挿入が失敗した場合は、すべてのデータをロールバックします。これは私のコードです:
using (var conn = new SqlConnection(_connectionString))
{
conn.Open();
using (var scope = new TransactionScope())
{
// Insert first table
using (var command = conn.CreateCommand())
{
command.CommandText =
@"INSERT INTO TableA(Id, Data)
VALUES(@id, @data)";
command.CommandType = CommandType.Text;
command.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { SourceColumn = "Id" });
command.Parameters.Add(new SqlParameter("@data", SqlDbType.Char) { SourceColumn = "Data" });
var adapter = new SqlDataAdapter();
adapter.InsertCommand = command;
adapter.Update(tableADataTable);
}
// Insert second table
using (var command = conn.CreateCommand())
{
command.CommandText =
@"INSERT INTO TableB(Id, Data)
VALUES(@id, @data)";
command.CommandType = CommandType.Text;
command.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { SourceColumn = "Id" });
command.Parameters.Add(new SqlParameter("@data", SqlDbType.Char) { SourceColumn = "Data" });
var adapter = new SqlDataAdapter();
adapter.InsertCommand = command;
adapter.Update(tableBDataTable);
}
scope.Complete();
}
}
私が抱えている問題は、2 番目のコマンドの実行中に例外がスローされた場合、最初のコマンドのデータがまだコミットされていることです。明示的にロールバックする必要がありますか? または、SqlDataAdapter.Update を使用するときに TransactionScope がどのように動作する必要がありますか?
注意すべき点は、もともと TransactionScope using ステートメント内で SqlConnection を作成していたことですが、DB サーバーが分散トランザクション用に正しく構成されていないというエラーを受け取ったため、それを移動しました。私の SqlConnection 作成が TransactionScope の外部にあるという事実は関連していますか?