1、创建SqlConnection对象(connStr是链接字符串)
SqlConnection conn = new SqlConnection(connStr);
2、创建SqlTransaction对象(执行事务)
因为SqlTransaction对象继承了DbTransaction对象
而DbTransaction的构造函数使用了Protected关键字保护,只能被基类和子类实例化
所以,如果我们要想创建一个SqlTransaction对象,就要从其他方面入手,比如SqlConnection对象
使用SqlConnection对象的BeginTransaction()函数创建一个SqlTransaction对象
SqlTransaction tran = conn.BeginTransaction();
3、创建SqlCommand对象,不过创建之前我们可以先看一下SqlCommand的构造函数
3.1
可以发现,后两个构造函数都可以传入SqlTransaction对象,我们只需要用第三个构造函数来创建SqlConmmand就行
SqlCommand cmd = new SqlCommand(sql,conn,tran);
3.2
如果有很多sql语句要执行,比如一个sql语句数组,则创建一个空的SqlCommand对象(不推荐,因为需要和数据库进行很多次交互,浪费性能)
SqlCommand cmd = new SqlCommand();
手动绑定SqlTransaction对象和SqlConnection对象
//绑定Command对象的Connection对象 cmd.Connection = conn; //绑定Command对象的Transaction对象 cmd.Transaction = tran;
通过循环来绑定和执行Sql语句(设置SqlCommand的CommandText属性)
//通过循环执行事务
int i; for (i = 0; i < sqls.Length; i++) { //设置要执行的语句 cmd.CommandText = sqls[i]; //添加参数 if (parm != null && parm[i] != null && parm[i].Length > 0) cmd.Parameters.AddRange(parm[i]); //执行 if (cmd.ExecuteNonQuery()<=0) { //回滚 tran.Rollback(); //结束 break; }; }
全部正确的话则提交事务
if(i==sqls.Length) tran.Commit();
4、完整代码
/// <summary> /// 执行一个事务 /// </summary> /// <param name="sqls">Sql语句数组</param> /// <param name="parm">参数数组(必须和sqls数组长度一致、如果为空也要传递过来)</param> /// <returns>返回成功或失败</returns> public static Boolean ExecuteTransaction(String[] sqls,params SqlParameter[][] parm) { //创建链接对象 using (SqlConnection conn = new SqlConnection(connStr)) { //打开链接 conn.Open(); //创建执行命令对象 SqlCommand cmd = new SqlCommand(); //创建一个事务 //通过conn对象获取一个事务对象 SqlTransaction tran = conn.BeginTransaction(); SqlCommand cmd1 = new SqlCommand(sqls[0],conn,tran); try { //绑定Command对象的Connection对象 cmd.Connection = conn; //绑定Command对象的Transaction对象 cmd.Transaction = tran; //通过循环执行事务 for (int i = 0; i < sqls.Length; i++) { //设置要执行的语句 cmd.CommandText = sqls[i]; //添加参数 if (parm != null && parm[i] != null && parm[i].Length > 0) cmd.Parameters.AddRange(parm[i]); //执行 if (cmd.ExecuteNonQuery()<=0) { //回滚 tran.Rollback(); //结束 return false; }; } //提交事务 tran.Commit(); return true; } catch (Exception e) { tran.Rollback(); return false; } } }