使用ADO.NET操作SqlServer,開啟一個事務


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

    }
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM