使用事務一般是進行數據寫入,數據讀取一般是不需要這貨的
第一種辦法:
使用存儲過程:
顧名思義,在存儲過程中定義好變量,定義好事務開始,結束,錯誤回滾然後在ADO.NET中正常調用存儲過程的方法就行
/// <summary> /// 通過存儲過程來使用事務 /// </summary> /// <param name="conn">數據庫鏈接</param> /// <param name="id">傳入的參數</param> private void TransactionDB(SqlConnection conn, int id) { SqlCommand cmd = new SqlCommand("spAddOrderxxxx", conn);//第一個參數為存儲過程名 cmd.CommandType = CommandType.StoredProcedure;//設置命令方式為存儲過程 cmd.Parameters.Add("@CustomerID", SqlDbType.Int).Value = id;//設置參數 try { conn.Open(); cmd.ExecuteNonQuery(); } catch (Exception ex) { Trace.Write(ex.Message); } finally { if (conn.State != ConnectionState.Closed) { conn.Close(); } } }
而事務提現在存儲過程中
CREATE PROcedure [spAddxxxx] @CustomerID int AS Begin Transaction ..........此處省略若干行 commit transaction return ErroHandler: rollback transaction return
第二種方式:采用ADO.NET帶有的事務處理方式(能對付不支持事務的數據庫哦)
private void Transaction(SqlConnection conn) { SqlCommand cmd = new SqlCommand("xxxxx", conn);//xxxxx為SQL語句 SqlTransaction transaction = null; try { conn.Open(); transaction = conn.BeginTransaction(); cmd.Transaction = transaction;//命令綁定事務 cmd.ExecuteNonQuery(); cmd.CommandText = "xxxxxxxxxxyyyyy";//換個命令再來! cmd.ExecuteNonQuery(); transaction.Commit();//OK,現在才開始執行哦 } catch (Exception ex) { transaction.Rollback();//異常回滾 } finally { if (conn.State != ConnectionState.Closed) { conn.Close(); } } }
結束,這就是使用事務的兩種方法。在進行大量數據寫入的情況下很適合用事務哦,具體原理~去翻SQL書吧。