1. 程式人生 > >執行多條SQL語句,實現資料庫事務(不可傳入Sql引數)

執行多條SQL語句,實現資料庫事務(不可傳入Sql引數)

          《圖書館維護系統》的時候我負責任務管理模組,由於一些業務有些複雜,所以想用儲存過程,但是賈琳師哥說了一堆儲存過程的不好,讓我用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)!分享給大家。。