トランザクション制御に関する分かり難いエラーメッセージ
トランザクション制御を行なうプログラムを実行した際、次のようなエラーメッセージが出力されることがある。
ExecuteNonQuery は、コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。コマンドの Transaction プロパティがまだ初期化されていません。
(ExecuteNonQueryの部分が、ExecuteReaderとなっているメッセージもある。)
日本語の意味がよく分からない。
このエラーメッセージは、接続型でも非接続型でも出力される。接続型の場合は、プログラム中にExecuteNonQuery()メソッドを直接記述しているのでまだいいが、非接続型ではプログラム中にExecuteNonQuery()の記述がないので混乱してしまう。
メッセージ中のコマンドとはOleDbCommandのことで、接続とはOleDbConnectionのことである。
メッセージ中の**“コマンドに割り当てられた接続”**とは、次の接続型のプログラムの最後の行を見ると分かるが、OleDbCommandのConnectionプロパティに設定されたOleDbConnectionオブジェクトのことである。
OleDbConnection CONN = new OleDbConnection();
// 省 略
OleDbCommand CMD = new OleDbCommand();
CMD.Connection = CONN; // <=== コマンドに割り当てられた接続
メッセージ中の**“保留状態”**とは、BeginTransaction()でトランザクションを開始したが、まだcommitもrollbackもされていない状態を指しているものと思われる。
エラーメッセージの意訳
コマンド(OleDbCommand)に割り当てられた接続(OleDbConnection)でトランザクション制御が行われているとき、コマンド(OleDbCommand)オブジェクトはTransactionオブジェクトを持たなければいけないので、Transactionプロパティに設定して下さい。
以下は、接続型と、非接続型のTransactionプロパティへのTransactionオブジェクトの設定の例。
OleDbTransaction TRN = CONN.BeginTransaction(IsolationLevel.ReadCommitted);
CMD.Transaction = TRN; // 接続型の為の記述
DA.InsertCommand.Transaction = TRN; // 非接続型の為の記述
DA.UpdateCommand.Transaction = TRN; // 非接続型の為の記述
DA.DeleteCommand.Transaction = TRN; // 非接続型の為の記述
・ACCESSにADO.NETでアクセスする場合のトランザクション制御 #1
・非接続型のトランザクション制御
・接続型のトランザクション制御
・複数のDataTableの変更を同時にDBに反映する際のトランザクション制御
・接続型、非接続型が混在した更新のトランザクション制御
・トランザクション制御に関する分かり難いエラーメッセージ