可以Rollback的Transaction與TransactionScope
最近才把Transaction的機制加到我的查詢工具裡,來控制Commit與Rollback。
之前沒有考慮作個Commit與Rollback的原因是,怕自己會去依賴Rollback。 所以我作資料異動時,一定確認好異動的筆數,然後備份表格,最後才真的執行SQL。
如果依賴Rollback,到時候囉不回去... 就囧了。
上次主管提到Transaction,想想也該來研究一下,當然就拿EzOracle查詢工具來測試。
上次主管提到Transaction,想想也該來研究一下,當然就拿EzOracle查詢工具來測試。
其實語法不難,可以參考MSDN:
Transaction http://msdn.microsoft.com/zh-tw/library/system.data.sqlclient.sqltransaction.commit.aspx
TransactionScope http://msdn.microsoft.com/zh-tw/library/h5w5se33.aspx
Transaction http://msdn.microsoft.com/zh-tw/library/system.data.sqlclient.sqltransaction.commit.aspx
TransactionScope http://msdn.microsoft.com/zh-tw/library/h5w5se33.aspx
IsolationLevel (MSDN) http://msdn.microsoft.com/zh-tw/library/aa259216(v=sql.80).aspx
我把原本的Query函式稍作調整…
public static string DB_ExecNonQuery_Trans(ref OracleTransaction transaction, string nSql)
{
if (Conn.State == ConnectionState.Closed) return "失敗=資料庫未連結";
try
{
/*
OracleCommand cmdGeneral = new OracleCommand(nSql, Conn );
/*
OracleCommand cmdGeneral = new OracleCommand(nSql, Conn );
double Result = cmdGeneral.ExecuteNonQuery();
*/
if (transaction == null) //transaction為null時,才需要重新指定,否則會error
{
transaction = Conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
}
OracleCommand command = Conn.CreateCommand();
//指定command的Transaction為transaction
command.Transaction = transaction;
command.CommandText = nSql;
double Result = command.ExecuteNonQuery();
return "成功=" + Result.ToString();
}
catch (Exception ex)
{
return "失敗=" + ex.Message;
}
}
其中灰底的部分是原本的程式。
另外要注意,因為這個函式可以重複被呼叫,(也就是,Transaction可以包多個異動的sql)
所以重複呼叫時要判斷if (transaction == null) 再去BeginTransaction,否則會錯誤。
所以重複呼叫時要判斷if (transaction == null) 再去BeginTransaction,否則會錯誤。
最麻煩的是… 要放個Commit和Rollback的功能按鈕,還有判斷是否指令已被Commit等… 這邊才是最多功的地方阿 Orz
沒有留言:
張貼留言