執行多條SQL語句,實現資料庫事務(不可傳入Sql引數)
阿新 • • 發佈:2019-01-09
《圖書館維護系統》的時候我負責任務管理模組,由於一些業務有些複雜,所以想用儲存過程,但是賈琳師哥說了一堆儲存過程的不好,讓我用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)!分享給大家。。