2

我正在研究 sql,我的查询是我有一些方法可以在其中执行不同的任务。例如:-第一种方法-插入第二种方法-更新第三种方法-删除第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

这取决于您拥有的数据库访问技术。

如果您使用实体框架,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

通常是这样的:

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

也许您应该创建一个存储过程并基于参数执行您的 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 回答