自己写的实现数据库事务的简单方法ExecuteSqlTran()

做项目时需要实现数据库的事务,觉得每次用SqlTransaction 写代码,太麻烦了,就想总结一个通用的方法放在数据层,以便复用.就自己写了简单的方法.可满足一般情况下的需求.:)

同时执行两条SQL语句的方法:

  public static void ExecuteSqlTran(string SQLString1,string SQLString2)
  {
   using (SqlConnection conn = new SqlConnection(strDBConnectionString))
   {
    conn.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection=conn;    
    SqlTransaction tx=conn.BeginTransaction();   
    cmd.Transaction=tx;    
    try
    {     
     cmd.CommandText=SQLString1;
     cmd.ExecuteNonQuery();
     cmd.CommandText=SQLString2;
     cmd.ExecuteNonQuery();     
     tx.Commit();     
    }
    catch(System.Data.SqlClient.SqlException E)
    {  
     tx.Rollback();
     throw new Exception(E.Message);
    }
   }
  } 

 

如果有多条SQL语句需要放在一个事务里实现执行,就用下面这个方法:

    /// <summary>
  /// 执行多条SQL语句,实现数据库事务。
  /// </summary>
  /// <param name="SQLStringList">多条SQL语句</param>  
  public static void ExecuteSqlTran(ArrayList SQLStringList)
  {
   using (SqlConnection conn = new SqlConnection(connectionString))
   {
    conn.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection=conn;    
    SqlTransaction tx=conn.BeginTransaction();   
    cmd.Transaction=tx;    
    try
    {     
     for(int n=0;n<SQLStringList.Count;n++)
     {
      string strsql=SQLStringList[n].ToString();
      if (strsql.Trim().Length>1)
      {
       cmd.CommandText=strsql;
       cmd.ExecuteNonQuery();
      }
     }          
     tx.Commit();     
    }
    catch(System.Data.SqlClient.SqlException E)
    {  
     tx.Rollback();
     throw new Exception(E.Message);
    }
   }
  }

方法虽然简单,但确实省了不少时间:)

(作者:李天平    转载请注明)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态代理可以实现数据库事务的管理,具体步骤如下: 1. 定义一个接口,该接口包含需要执行的数据库操作方法。 2. 实现该接口的类,该类用于执行具体的数据库操作。 3. 创建一个动态代理类,该类实现InvocationHandler接口,并重invoke方法。 4. 在invoke方法实现事务管理,即在执行数据库操作前开启事务,在操作后根据操作结果提交或回滚事务。 5. 在需要执行数据库操作的代码中,创建动态代理对象并调用接口方法。 下面是一个简单的示例代码: ```java public interface UserDao { void addUser(User user); void deleteUser(int userId); } public class UserDaoImpl implements UserDao { @Override public void addUser(User user) { // 执行添加用户操作 } @Override public void deleteUser(int userId) { // 执行删除用户操作 } } public class TransactionHandler implements InvocationHandler { private Object target; public TransactionHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Connection conn = null; PreparedStatement stmt = null; try { // 获取数据库连接 conn = getConnection(); // 开启事务 conn.setAutoCommit(false); // 执行目标方法 Object result = method.invoke(target, args); // 提交事务 conn.commit(); return result; } catch (Exception e) { // 回滚事务 conn.rollback(); throw e; } finally { // 关闭数据库连接 closeConnection(conn, stmt); } } private Connection getConnection() { // 获取数据库连接 } private void closeConnection(Connection conn, PreparedStatement stmt) { // 关闭数据库连接 } } public class Test { public static void main(String[] args) { UserDao userDao = new UserDaoImpl(); TransactionHandler handler = new TransactionHandler(userDao); UserDao proxy = (UserDao) Proxy.newProxyInstance( userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), handler); // 使用代理对象执行数据库操作 proxy.addUser(new User("张三", "123456")); proxy.deleteUser(1); } } ``` 在上面的示例代码中,TransactionHandler类是动态代理类,它实现了InvocationHandler接口,并重了invoke方法。在invoke方法中,先获取数据库连接,然后开启事务,执行目标方法,根据操作结果提交或回滚事务,最后关闭数据库连接。 在Test类中,创建了UserDaoImpl对象和TransactionHandler对象,然后使用Proxy类的newProxyInstance方法创建了代理对象,并调用代理对象的方法执行数据库操作。由于使用了动态代理,所以在执行数据库操作时会自动进行事务管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值