2

私はSQLに取り組んでいます。私のクエリは、さまざまなタスクを実行しているいくつかのメソッドがあるということです。例:- 1 番目の方法 - 挿入 2 番目の方法 - 更新 3 番目の方法 - 削除 4 番目の方法 - 挿入

今、これらすべてを一度に実行したいと思います。しかし、何らかのエラーが発生した場合、プロセス全体がそれをロールバックします。

コード:

private void btnSubmit_Click(object sender, EventArgs e)
{
    DialogResult dr = MessageBox.Show("Are you sure you want to submit the information? Click 'Yes' to Submit or 'No' to re-Check.", "eParty - Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
    if (dr == DialogResult.Yes)
    {
        this.Cursor = Cursors.WaitCursor;

        INSERT();
        UPDATE();
        DELETE();
        INSERTAGAIN();

        MessageBox.Show("Booked successfully.", "eParty - Done!", MessageBoxButtons.OK, MessageBoxIcon.Information);
        this.Cursor = Cursors.Default;

        this.Cursor = Cursors.WaitCursor;

        this.Close();
    }
    else
    {

    }
}

「btnSubmit_Click」メソッドでトランザクションを実装する方法...

4

7 に答える 7

2

これを試して:

  using(var scope = new TransactionScope())
  {
    INSERT();
    UPDATE();
    DELETE();
    INSERTAGAIN();

    scope.Complete(); //if we make it here - commit the changes, 
                      //if not - everything is rolled back

  }

System.Transactionsプロジェクトに含めることを忘れないでください

于 2013-03-07T10:25:24.737 に答える
0

通常、次のようなものです。

void DoStuff(args)
{
    using (var conn = CreateOpenConnection())
    using (var tran = conn.BeginTransaction())
    {
        try
        {
            // various operations here
            ForExample(conn, tran);
            tran.Commit();
        }
        catch
        {
            tran.Rollback();
            throw;
        }
    }
}

void ForExample(DbConnection conn, DbTransaction tran = null)
{
    using (var cmd = conn.CreateCommand())
    {
        cmd.Transaction = tran;
        cmd.CommandText = "For example";
        // cmd.Parameters.Add(...)
        cmd.ExecuteNonQuery();
    }
}

これのほとんどは、未加工の ADO.NET の上にある利用可能なツール/ライブラリのいずれかを使用して削減できます。

于 2013-03-07T10:24:08.560 に答える
0

これを実現するには、.Net の TransactionScope クラスを使用できます。 http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx 必要に応じて分離レベルを選択できます。よくわからない場合は、最も一貫性があり、パフォーマンスが最も低い Serializable レベルを使用してください。ただし、SQL ストアド プロシージャに分離レベルがある場合は、それらが優先されます。これが重要な設計である場合は、続行する前にトランザクションについてお読みください。

于 2013-03-07T10:24:18.247 に答える
0

使用しているデータベース アクセス テクノロジによって異なります。

Entity Framework を使用する場合、SaveChanges()メソッドは既にトランザクションをサポートしています。

純粋な ADO.NET の場合は、これを参照してください https://stackoverflow.com/a/224702/210994

于 2013-03-07T10:21:11.837 に答える
0

ADO トランザクションを使用して、トランザクションをパラメーターとしてすべてのメソッドに送信できます。

SqlConnection db = new SqlConnection("connstringhere");
SqlTransaction transaction;
db.Open();
transaction = db.BeginTransaction();
try 
{
     INSERT(transaction);
     UPDATE(transaction);
     DELETE(transaction);
     INSERT(transaction);
     transaction.Commit();
} 
catch (SqlException sqlError) 
{
     transaction.Rollback();
}
于 2013-03-07T10:21:33.020 に答える
0

このトピックを参照してください:トランザクション スコープを使用した暗黙的なトランザクションの実装.

TransactionScope クラスは、コードのブロックをトランザクションに参加していることを示す簡単な方法を提供します。トランザクション自体を操作する必要はありません。トランザクション スコープは、アンビエント トランザクションを自動的に選択および管理できます。使いやすさと効率性から、トランザクション アプリケーションを開発する場合は TransactionScope クラスを使用することをお勧めします。さらに、トランザクションで明示的にリソースを登録する必要はありません。System.Transactions リソース マネージャー (SQL Server 2005 など) は、スコープによって作成されたアンビエント トランザクションの存在を検出し、自動的に参加させることができます。

また、この質問とその回答を読むことをお勧めします。複数の接続でのトランザクションの使用に関する興味深いトピックに触れています。

于 2013-03-07T10:23:16.573 に答える
0

おそらく、1 つのストアド プロシージャを作成し、パラメーターに基づいて CRUD 操作を実行する必要があります。例えば:

    BEGIN TRANSACTION

    IF(@PartyID <= 0)
    BEGIN
        //INSERT
    IF @@ERROR <> 0
        BEGIN
            ROLLBACK TRANSACTION
            RETURN
        END
    END
    ELSE
    BEGIN
        //UPDATE
    IF @@ERROR <> 0
        BEGIN
            ROLLBACK TRANSACTION
            RETURN
        END
    END
于 2013-03-07T10:24:45.253 に答える