执行多条SQL语句,实现数据库事务(无参)

《图书馆维护系统》的时候我负责任务管理模块,由于一些业务有些复杂,所以想用存储过程,但是贾琳师哥说了一堆存储过程的不好,让我用sql语句。好吧,用就用吧,但是吧,大家都知道执行多条sql语句,是需要用到事务的(保持数据一致性),存储过程中加事务我还是会滴,但是要是加在代码里,就没有用过了,怎么”避免”代码里用事务呢?嘿嘿,潜心研究发现了这个——“执行多条SQL语句,实现数据库事务(自定义的函数,写在SqlHelper里,D层调用方便)”

分享给大家!!

分两篇博客来写:

第一篇:无参事务函数

第二篇:有参事务函数

 

D层SqlTaskAssignInfo类:(些许涉及到“泛型”的知识,若有兴趣,请访问我的博客:泛型)

  1. using System.Collections.Generic; //韩学敏添加的引用,使用了 List<string> lstOne = new List<string>(){ sql1, sql2 };
  2.          /// <summary>
  3.         /// 组长分配任务(更新任务信息表T_TaskInfo和任务分配表T_TaskAssignInfo)
  4.          /// </summary>
  5.         /// <param name=”modelTaskAssignInfo”>
  6.         /// 任务分配信息实体类(任务ID、小组ID、成员ID、成员姓名、组长分配日期、组长分配时间)
  7.         /// </param>
  8.         /// <returns>bool(true:分配成功;false:分配失败)</returns>
  9.         public bool AssignTask2(Entity.TaskAssignInfoEntity enTaskAssignInfo)
  10.         {
  11.             //1,sql1语句:根据任务ID和分配等级,更新任务分配信息表T_TaskAssignInfo中任务分配状态字段taskDistributeState的值为‘已分配’
  12.             string sql1 = “update T_TaskAssignInfo set taskDistributeState=’已分配’ where taskID='” + enTaskAssignInfo.taskID + “‘ and distributeLevel=’1′”;
  13.             //2,sql2语句:向任务分配信息表中插入一条组长分配的任务信息,包括(任务ID,小组ID,成员ID,成员姓名、分配日期、分配时间、分配等级、提交状态)
  14.             string sql2 = “insert into T_TaskAssignInfo(taskID,groupID,memberID,memberName,distributeDate,distributeTime,distributeLevel,submitState) values(” + enTaskAssignInfo.taskID + ‘,’ + enTaskAssignInfo.groupID + ‘,’ + enTaskAssignInfo.memberID + ‘,’ + “‘” + enTaskAssignInfo.memberName
  1. + “‘” + ‘,’ + “‘” + enTaskAssignInfo.distributeDate + “‘” + ‘,’ + “‘” + enTaskAssignInfo.distributeTime
  1. + “‘” + ‘,’ + “‘” + ‘2’ + “‘,’未提交'” + “)”;
  2.             List<string> lstSql = new List<string>() { sql1, sql2 };//泛型集合(此泛型集合只接受字符串类型):sql1、sql2
  3.             int rows = DbHelperSQL.ExecuteSqlTran(lstSql);//调用DbHelperSQL类的ExecuteSqlTran()函数(执行多条sql语句,完成数据库事务)
  4.             if (rows > 0)//如果几条sql语句均执行成功
  5.             {
  6.                 return true;//返回值为true
  7.             }
  8.             else//如果执行失败
  9.             {
  10.                 return false;//返回值为false
  11.             }
  12.         }

 

(注:DbHelperSQL类代码中的ConnectionString是写在配置文件里的数据库连接字符串)

DbHelperSQL类:

  1. using System.Configuration ‘这里添加后,还必须在管理器中添加引用
  2. public static string connectionString = ConfigurationManager.AppSettings[“ConnectionString”];
  3.         /// <summary>
  4.         /// 执行多条SQL语句,实现数据库事务。
  5.          /// </summary>
  6.         /// <param name=”SQLStringList”>多条SQL语句</param>
  7.         public static int ExecuteSqlTran(List<String> SQLStringList)
  8.         {
  9.             using (SqlConnection conn = new SqlConnection(connectionString))
  10.             {
  11.                 conn.Open(); //打开数据库连接
  12.                 SqlCommand cmd = new SqlCommand(); //创建SqlCommand命令
  13.                 cmd.Connection = conn; //设置命令连接
  14.                 SqlTransaction tx = conn.BeginTransaction();//开始事务
  15.                 cmd.Transaction = tx;//设置执行命令的事务
  16.                 try
  17.                 {
  18.                     int count = 0;//定义int类型变量,存放该函数返回值
  19.                     for (int n = 0; n < SQLStringList.Count; n++)//循环传入的sql语句
  20.                     {
  21.                         string strsql = SQLStringList[n]; //第n条sql语句
  22.                         if (strsql.Trim().Length > 1) //如果第n条sql语句不为空
  23.                         {
  24.                             cmd.CommandText = strsql; //设置执行命令的sql语句
  25.                             count += cmd.ExecuteNonQuery(); //调用执行增删改sql语句的函数ExecuteNonQuery(),执行sql语句
  26.                         }
  27.                     }
  28.                     tx.Commit();//提交事务
  29.                     return count;//返回受影响行数
  30.                 }
  31.                 catch
  32.                 {
  33.                     tx.Rollback();
  34.                     return 0;
  35.                 }
  36.             }
  37.         }

 

配置文件:

  1. <appSettings>   <add key=”ConnectionString” value=”server=hanxuemin;database=Library;uid=sa;pwd=123456″/>
  2. </appSettings>

 

总结:观察D层SqlTaskAssignInfo类,组长分配任务函数AssignTask2()中的两条sql语句,有没有觉得通过拼接字符串获得sql语句看起来很是复杂,而且如果sql语句很长,涉及到的参数很多的话,拼接起来很麻烦,拼错的可能极大,是不是很想用参数??下篇博客将介绍有参的事务函数ExecuteSqlTran(Hashtable SQLStringList)!分享给大家。。

标签