SQL Server CE.NET CFVisual Studio .NET 2002SQL Server 2000.NET 1.0DBAVisual Studio .NET 2003.NET 1.1Visual Studio 2005ADO.NET.NET 2.0SQL Server 2005移动应用中级开发Visual StudioSQL ServerSQLWindows.NETC#
更轻松地处理数据库事务 - 扩展 Using 语句以执行自动数据库事务






4.47/5 (20投票s)
2004年10月25日
2分钟阅读

122506

978
任何进行数据库更新的用户都会使用事务。在 ADO.NET 中,事务使用事务对象和 try..catch 来完成,但是有一种更简单的方法,甚至可以说是一种更 C# 的方式来处理数据库事务。
概述
任何进行数据库更新的用户都会使用事务。在 ADO.NET 中,事务使用事务对象和 try..catch 来完成,但是有一种更简单的方法,甚至可以说是一种更 C# 的方式来处理数据库事务。
Visual Basic .NET 用户
因为此技术依赖于 C# 特有的 using 语句,所以此技术不能应用于 Visual Basic .NET。 然而,有传言说 Visual Studio .NET 2005 将为 Visual Basic 包含类似的语句。
正常的事务处理方式
这是一个正常的数据库事务处理的示例。 这是 MSDN 上的示例的简化版本。
using (OleDbTransaction xTx = _DB.BeginTransaction()) {
    try {
        OleDbCommand xCmd = _DB.CreateCommand();
        xCmd.Transaction = xTx;
        xCmd.CommandText = "Insert into Person (Name, Telephone)" + 
                           " values ('Normal One', '(412) 555-1212')";
        xCmd.ExecuteNonQuery();
        if (chckThrow.Checked) {
            throw new Exception("Test Exception");
        }
        xCmd.CommandText = "Insert into Person (Name, Telephone)" + 
                           " values ('Normal Two', '(423) 555-1212')";
        xCmd.ExecuteNonQuery();
        xTx.Commit();
    }
    catch (Exception xException) {
        xTx.Rollback();
        throw xException;
    }
}
简单的事务处理方式
使用我的方法,代码执行相同的操作,但变得更短、更简洁,甚至更像 C#。
using (Transaction xTx = new Transaction(_DB)) {
    OleDbCommand xCmd = _DB.CreateCommand();
    ((IDbCommand)xCmd).Transaction = xTx.DBTransaction;
    xCmd.CommandText = "Insert into Person (Name, Telephone)" + 
                       " values ('Object One', '(412) 555-1212')";
    xCmd.ExecuteNonQuery();
    if (chckThrow.Checked) {
        throw new Exception("Test Exception");
    }
    xCmd.CommandText = "Insert into Person (Name, Telephone)" + 
                       " values ('Object Two', '(423) 555-1212')";    
    xCmd.ExecuteNonQuery();
    xTx.Commit();
}
演示项目
演示项目演示了这一点,并允许模拟异常。 为了简单起见,演示项目使用包含的 Access 数据库文件。 但是,包含的类适用于任何 ADO.NET 数据源。
工作原理
C# 中的 using 语句导致在退出块时调用 dispose。 通过实现 Dispose,并检查事务是否已提交,事务类可以确定是否调用回滚。 无需重新抛出可能正在进行的任何异常,因为 C# 会自动继续异常路径,作为处理 using 块的一部分。
事务类源代码
public class Transaction : IDisposable {
    private IDbConnection _DB;
    private IDbTransaction _DBTransaction;
    public IDbTransaction DBTransaction {
      get { return _DBTransaction; }
    }
    public Transaction(IDbConnection aDB) : this(aDB, true) {
    }
    public Transaction(IDbConnection aDB, bool aHandle) {
      if (aHandle) {
        _DB = aDB;
        _DBTransaction = _DB.BeginTransaction();
      }
    }
    public void Commit() {
      if (_DB != null) {
        _DBTransaction.Commit();
        _DBTransaction.Dispose();
        _DB = null;
      }
    }
    public void Dispose() {
      if (_DB != null) {
        _DBTransaction.Rollback();
        _DBTransaction.Dispose();
        _DB = null;
      }
    }
}
结论
此类纯粹为您的代码添加语法糖,并使执行事务变得更容易。 功能相同。 但是,当处理事务并且必须每次手动创建此结构时,较短的版本更容易键入,并且在再次处理代码时也更容易阅读。
