执行多条SQL语句,实现数据库事务(不可传入Sql参数)

来源:互联网 发布:培训机构的程序员 编辑:程序博客网 时间:2024/05/22 13:14

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

分享给大家!!

分两篇博客来写:

第一篇:无参事务函数

第二篇:有参事务函数

 

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

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

 

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

DbHelperSQL类:

using System.Configuration '这里添加后,还必须在管理器中添加引用public static string connectionString = ConfigurationManager.AppSettings["ConnectionString"];        /// <summary>        /// 执行多条SQL语句,实现数据库事务。         /// </summary>        /// <param name="SQLStringList">多条SQL语句</param>        public static int ExecuteSqlTran(List<String> SQLStringList)        {            using (SqlConnection conn = new SqlConnection(connectionString))            {                conn.Open(); //打开数据库连接                SqlCommand cmd = new SqlCommand(); //创建SqlCommand命令                cmd.Connection = conn; //设置命令连接                SqlTransaction tx = conn.BeginTransaction();//开始事务                cmd.Transaction = tx;//设置执行命令的事务                try                {                    int count = 0;//定义int类型变量,存放该函数返回值                    for (int n = 0; n < SQLStringList.Count; n++)//循环传入的sql语句                    {                        string strsql = SQLStringList[n]; //第n条sql语句                        if (strsql.Trim().Length > 1) //如果第n条sql语句不为空                        {                            cmd.CommandText = strsql; //设置执行命令的sql语句                            count += cmd.ExecuteNonQuery(); //调用执行增删改sql语句的函数ExecuteNonQuery(),执行sql语句                        }                    }                    tx.Commit();//提交事务                    return count;//返回受影响行数                }                catch                {                    tx.Rollback();                    return 0;                }            }        }

 

配置文件:

<appSettings>   <add key="ConnectionString" value="server=hanxuemin;database=Library;uid=sa;pwd=123456"/></appSettings>

 

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

原创粉丝点击