|
分類:[C# (ASP.NET)]
こんにちわ。
トランザクションの実装方法について、ご教授いただければと書込ました。
今までは1トランザクションで完結していて、細かいところは省略しますが大凡
SqlTransaction sqlTran;
using (SqlConnection sqlCon = new SqlConnection(CONNECTION)) { sqlCon.Open(); sqlTran = sqlCon.BeginTransaction(); using (SqlCommand sqlCmd = new SqlCommand("SQL文"), sqlCon, sqlTran) { try { sqlCmd.Parameters.AddWithValue(パラメータ設定);
if (sqlCmd.ExecuteNonQuery() >= 1) { sqlTran.Commit(); return true; } else { sqlTran.Rollback(); return false; } } catch (Exception ex) { sqlTran.Rollback(); return false; } finally { sqlCon.Close(); } } }
こんな感じでやっていました。 1件(1処理)だけだったのでこれで良かったんですが、複数回実行する必要が出てきました。 その時、全て成功だったらコミットで、どれか一つでも失敗したらロールバックしようと思っています。 ですが上記の方法では1回成功しただけでコミットしてしまっているので、この関数をループで呼び出しても 当然1処理事にコミットしてしまいます。
となるとトランザクションを外出しにして、この関数にトランザクションを引数として渡し 全てtrueだった場合に、関数を呼び出した側でコミットorロールバックしようと思ってるんですが これだとトランザクション系がクラスではなく、apsx(ascx)の.cs部分に記入する事になります。 いわゆるaspxとかには表示だけの処理、実際の処理は関数を呼び出すだけで、本体は別ファイルのクラスの中。 そういう構造でやってるんですが、トランザクションを外出しにするとこれではなくなってしまいます。
何かいい方法はないでしょうか? 思いついたのは呼び出し側と実処理クラスの間にもう一つ挟んで、それをaspxから呼び出すというものです。 今はaspx→処理クラス(今回の関数)を直接呼んでいますが これを aspx→トランザクション処理だけするクラス→処理クラス(今回の関数)としようと思ったんですが これだと真ん中の部分が汎用性のないクラスになってしまいます。 ループするわけなので、ここでループ処理とaspxから渡された引数等の処理もしないといけないので 固定された引数等にしか対応できなくなるので。 このトランザクションの部分をどんなSQLでも、パラメータが変わっても対応できればそれが最高なんですが・・・
もっと便利な方法があったりするでしょうか?
|