0

データベースアプリケーションでSQLステートメントのトランザクションを追加する必要があります。これまでは、主にデータを取得したり、既存のデータにごくわずかな変更を加えたりしていたため、これを行う必要はありません。

私はネストされたusingステートメントで整頓された構成を非常にうまく使用していますが、この変更された構成がトランザクションが埋め込まれた状態で期待どおりに機能するかどうかを私よりよく知っている人に確認したいと思います。

        using (SqlCommand cmd = new SqlCommand())
        using (cmd.Connection = new SqlConnection()) {
            cmd.Connection.ConnectionString = "...";
            cmd.Connection.Open();
            using (SqlTransaction tran = cmd.Connection.BeginTransaction()) {
                // do the work (try catch wraps the statements)
                // commit transaction if no errors found or rollback
            }
            cmd.Connection.Close();
        }

よろしくマーティンよろしくお願いします

4

3 に答える 3

1

あなたが書いたように、それはうまくいきません - SqlCommand クラスのTransaction プロパティを介してコマンドをトランザクションに関連付ける必要があります。また、トランザクションを開始するには、最初に接続を開く必要がある場合があります

TransactionScope を使用する方が簡単ですが、MSDTCを使用するようにデータベース サーバーをセットアップする必要があります。

私が働いている共有環境を使用しており、MSDTC はオプションではありません。

于 2012-04-23T17:56:46.753 に答える
1

TransactionScopeより使いやすい組み込みクラスがあります。ブロックでインスタンス化すると、そのusing中のすべてが同じトランザクションの一部になります。

using(var ts = new TransactionScope())
using (SqlCommand cmd = new SqlCommand()) 
using (cmd.Connection = new SqlConnection()) 
{ 
  cmd.Connection.ConnectionString = "...";
  cmd.Connection.Open();

  // Do the work

  ts.Complete();

  cmd.Connection.Close();
}

例外が発生した場合、トランザクションスコープは破棄時にすべての操作を自動的に中止します。transactionscope は、db 接続を渡す必要なく、呼び出された関数で実行される操作にも影響します。

于 2012-04-23T15:41:13.787 に答える
0

の代わりにSqlTransaction、の使用を検討してTransactionScopeください。

とあなたは創造物の周りにそのステートメントTransactionScopeをラップする必要があります。コミットするには、ブロックが終了する前に呼び出す必要があります。usingSqlConnectionComplete

using (var tx = new TransactionScope())
using (SqlCommand cmd = new SqlCommand())
using (cmd.Connection = new SqlConnection()) 
{
    cmd.Connection.ConnectionString = "...";
    cmd.Connection.Open();

    // do the work (try catch wraps the statements)
    // commit transaction if no errors found or rollback

    tx.Complete(); // commits transaction
}
于 2012-04-23T15:44:06.580 に答える