私はADO.NET SqlCommandオブジェクトを作成し、データベース(SQL Server 2005)に保存する項目のリストをループする小さなC#メソッドを継承しました。リファクタリングADO.NET - SqlTransactionとTransactionScope
従来のSqlConnection/SqlCommandアプローチが使用され、すべての動作が確実に行われるように、2つのステップ(古いエントリの削除、新しいエントリの挿入)がADO.NET SqlTransactionにラップされます。
using (SqlConnection _con = new SqlConnection(_connectionString))
{
using (SqlTransaction _tran = _con.BeginTransaction())
{
try
{
SqlCommand _deleteOld = new SqlCommand(......., _con);
_deleteOld.Transaction = _tran;
_deleteOld.Parameters.AddWithValue("@ID", 5);
_con.Open();
_deleteOld.ExecuteNonQuery();
SqlCommand _insertCmd = new SqlCommand(......, _con);
_insertCmd.Transaction = _tran;
// add parameters to _insertCmd
foreach (Item item in listOfItem)
{
_insertCmd.ExecuteNonQuery();
}
_tran.Commit();
_con.Close();
}
catch (Exception ex)
{
// log exception
_tran.Rollback();
throw;
}
}
}
は今、私は最近、.NETのTransactionScopeクラスについて多くを読んでいる、と私は思っていた、好ましいアプローチは、ここでは何ですか?
using (TransactionScope _scope = new TransactionScope())
{
using (SqlConnection _con = new SqlConnection(_connectionString))
{
....
}
_scope.Complete();
}
何が好きなのですか?また、その理由は何ですか?(読みやすさ、スピード、信頼性)
http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx
を基本的な考え方は、トランザクションスコープがあなたのために、「アンビエントトランザクションコンテキストを」管理するということです。
マルク・
ありがとうJohnさん、ありがとうございます - この例ではusing()ブロック(まだ!)のSqlCommandを持っていません - これは進行中の作業です:-) –
re:SQLCommandを使用中、ありますSQLConnectionのDispose()メソッドはClose()メソッドを呼び出します。したがって、Dispose()はSQLCommandメソッドを呼び出しますか? –
クラスが 'IDisposable'を実装していて、このクラスのインスタンスを作成した場合、そのクラスに対してDisposeを呼び出す必要があります。これを行う最も簡単な方法は、 'using'ブロックを使うことです。私は常に1つを実装するという習慣に入るのが最善だとわかります。 –