2011年11月14日 星期一

[C#] 可以Rollback的Transaction與TransactionScope

可以RollbackTransactionTransactionScope
最近才把Transaction的機制加到我的查詢工具裡,來控制CommitRollback
之前沒有考慮作個CommitRollback的原因是,怕自己會去依賴Rollback。 所以我作資料異動時,一定確認好異動的筆數,然後備份表格,最後才真的執行SQL
如果依賴Rollback,到時候囉不回去... 就囧了。
上次主管提到Transaction,想想也該來研究一下,當然就拿EzOracle查詢工具來測試。




我把原本的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 );
                double Result = cmdGeneral.ExecuteNonQuery();
               */
                if (transaction == null//transactionnull時,才需要重新指定,否則會error
                {
                    transaction = Conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
                }
               OracleCommand command = Conn.CreateCommand();
               //指定commandTransactiontransaction
                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,否則會錯誤。

最麻煩的是… 要放個CommitRollback的功能按鈕,還有判斷是否指令已被Commit… 這邊才是最多功的地方阿 Orz


沒有留言:

張貼留言