0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ACCESSにADO.NETでアクセスする場合のトランザクション制御 #6

Last updated at Posted at 2015-06-19

トランザクション制御に関する分かり難いエラーメッセージ

トランザクション制御を行なうプログラムを実行した際、次のようなエラーメッセージが出力されることがある。

ExecuteNonQuery は、コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。コマンドの Transaction プロパティがまだ初期化されていません。

(ExecuteNonQueryの部分が、ExecuteReaderとなっているメッセージもある。)

日本語の意味がよく分からない。
このエラーメッセージは、接続型でも非接続型でも出力される。接続型の場合は、プログラム中にExecuteNonQuery()メソッドを直接記述しているのでまだいいが、非接続型ではプログラム中にExecuteNonQuery()の記述がないので混乱してしまう。

メッセージ中のコマンドとはOleDbCommandのことで、接続とはOleDbConnectionのことである。

メッセージ中の**“コマンドに割り当てられた接続”**とは、次の接続型のプログラムの最後の行を見ると分かるが、OleDbCommandのConnectionプロパティに設定されたOleDbConnectionオブジェクトのことである。

コマンドのConnectionプロパティに接続が割り当てられている
OleDbConnection CONN = new OleDbConnection();
// 省 略
OleDbCommand CMD = new OleDbCommand();
CMD.Connection = CONN;    // <=== コマンドに割り当てられた接続

メッセージ中の**“保留状態”**とは、BeginTransaction()でトランザクションを開始したが、まだcommitもrollbackもされていない状態を指しているものと思われる。

エラーメッセージの意訳
コマンド(OleDbCommand)に割り当てられた接続(OleDbConnection)でトランザクション制御が行われているとき、コマンド(OleDbCommand)オブジェクトはTransactionオブジェクトを持たなければいけないので、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に反映する際のトランザクション制御
接続型、非接続型が混在した更新のトランザクション制御
・トランザクション制御に関する分かり難いエラーメッセージ

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?