It技術

3246エラー「Connection オブジェクトは、トランザクション中に明示的に閉じることができません。」の対処法【Access VBA】


Error
3246エラー「Connection オブジェクトは、トランザクション中に明示的に閉じることができません。」

原因

トランザクションに不備がない場合、SQL文が間違っている可能性があります。

すでに値があるのにINSERTしようとしていませんか?

詳細と解説

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16

'データベースに接続
Dim cn As New ADODB.Connection
Set cn = New ADODB.Connection
cn.Open DBLink

'実行したいSQL
Dim strSQL As String
strSQL = "INSERT INTO 猫 (名前, 色) VALUES (たま, 白), (ポチ, 三毛);"

'トランザクションの開始
cn.BeginTrans 
cn.Execute strSQL 'INSERT文の実行
cn.CommitTrans

cn.Close

3246番のエラーで検索すると、CloseやRollbacksの問題ではないかという解答が得られますが、上記のようにトランザクションに不備はないコードでも同様のエラー文が見られます。

理由は単純で、INESRTしようとしている値がすでに存在していただけでした。

上の例だと、猫テーブルにたまかポチの値がすでに存在するはずです。

まとめ
SQL文を見直すことで修正できるかもしれません