|  | 分類:[C#]
 
 
 VisualStudio2005 C#,OS windowsXPで開発しています。
 
 トランザクションを使用して、ループ内で連続でsql(いずれもUPDATE文)を発行し、
 エラーのあった場合はロールバックをさせたいと思っています。
 
 ArrayList updateSql = new ArrayList();
 updateSql.Add(UpdateSql1); update文1(正常)
 updateSql.Add(UpdateSql2);  update文2(エラーを含む)
 
 IDbCommand comm = conn.CreateCommand();
 IDbTransaction trn = conn.BeginTransaction();
 comm.Transaction = trn;
 foreach (string sql in updateSql) {
 
 comm.CommandText = sql;
 try {
 ret_cd = comm.ExecuteNonQuery();
 } catch(Exception ex) {
 trn.Rollback();
 break;
 }
 }
 
 今起こっている現象は、update文1の後、update文2を実行してエラーの為にrollbackするのですが、
 先に実行したupdate文1が勝手にコミットされてしまうようで、rollbackされないのです。
 後に実行したupdate文2はrollbackされています。
 
 ループでSQLを実行するという方法が悪いのでしょうか。
 ループを使わないとするならば以下のようになると思います。
 
 
 IDbCommand comm = conn.CreateCommand();
 IDbTransaction trn = conn.BeginTransaction();
 comm.Transaction = trn;
 try {
 comm.CommandText = UpdateSql1;
 ret_cd = comm.ExecuteNonQuery();
 comm.CommandText = UpdateSql2;
 ret_cd = comm.ExecuteNonQuery();
 } catch(Exception ex) {
 trn.Rollback();
 }
 
 ご教授よろしくお願いします。
 
 |