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;
}
}
}
