|
分類:[C#]
お世話になっております。
C#でSqlClientクラスでSQL分を書いています。
メインとサブで別々のSqlClientモジュール(変数)で同データベースに接続しています。
メインでは該当テーブルデータを削除(TRUNCATE TABLE)しており、サブでデータをインサートしています。
サブが失敗した場合はメインのトランザクションをロールバックしてデータを戻したいのですが、
メインとサブで別々のSqlClientで接続しているためか、メインでロールバックしてもサブでインサートしで成功したデータが残っています。 (こういうものなのでしょうか?)
サブが失敗した場合はメインでロールバックするとデータを削除前に戻したのですが、実現するにはどのような構成をとればよいのでしょうか?
単純にメインで接続しているオブジェクト(SqlConnection)をサブに渡せばよいのかな?
とも思ったのですが(未検証)、何かいい方法があればご教授頂けると幸いです。 m(__)m
※実際のテーブルはカラムが多いので一時テーブルに元データをコピーなどは避けたいです。
---イメージ--- Main() { SqlConnection SCon; SqlCommand SCmd; SqlTransaction STran;
SCon.Open(); SCmd = SCon.CreateCommand(); SCmd.CommandText = "TRUNCATE FROM TestTable" STran = SCon.BeginTransaction(); SCmd.Transaction = STran; SqlCmd.ExecuteNonQuery(); /* if ( SubFunction() ) {//成功 SqlCmd.Transaction.Commit(); } else {//失敗 SqlCmd.Transaction.Rollback(); } */ //サブ内のSqlClientで同DB(テーブル)に接続してデータインサート SubFunction();
//検証のため絶対にロールバック //サブのデータ挿入前になるはず - ならない TT SqlCmd.Transaction.Rollback(); --- VS2010 WinXP
|