• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:手動または分散トランザクションモード…のエラー)

分散トランザクションモードのエラー

このQ&Aのポイント
  • VisualBasic 6 sp6を使用している際に発生する「手動または分散トランザクションモードのため、新規接続を作成できません。」というエラーについて解説します。
  • エラーの原因はトランザクションの開始・終了のタイミングで、分散トランザクションモードがオンになっているため新規接続を作成できないことです。
  • 解決方法としては、トランザクションの開始をプロシージャの先頭で行うようにし、終了は必要な処理が終わった後に行うようにすることです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

http://support.microsoft.com/kb/234218/ja には、 >MTS のトランザクション内で、開いている ADO Connection オブジェクトを複数の操作に使用する >場合は、次の手順を推奨します。 >開いているすべてのレコードセットは、ほかの操作を実行する前に、接続を解除するか閉じるかして、 >何も設定されていない状態にします。 >使われていないすべての Command オブジェクトは、何も設定されていない状態にします。 ## 推奨って書いているけど、こうしないとエラーになってできないのに。。。 つまり、 objRsB.Open strSQL, objConn をしようとしているときには、 objRsA.Open strSQL, objConn の方は、closeして、set objRsA = nothing 等を使ってクリアを済ませていないとエラーとなる ということです。 ⇒今、書いているソースの方法はできないということ。 対策1 Set objConn = New ADODB.Connection ↓ Set objConnA = New ADODB.Connection Set objConnB = New ADODB.Connection にして、 objRsA.Open strSQL, objConn ↓ objRsA.Open strSQL, objConnA および objRsB.Open strSQL, objConn ↓ objRsB.Open strSQL, objConnB と変更する。(これで使いまわししていない状態となります) 対策2 sSQL = "select * from テーブルA" を sSQL = "select (使っている項目名を列記)from テーブルA,テーブルB" & "where A.key = B.key" として、 sSQL = "select * from テーブルB where key = " & objRsA.Fields("key") objRsB.Open strSQL, objConn を廃止。 ・・・Selectの発行回数が、テーブルAのレコード件数+1回から、1回に減るのでこの方法のほうが いいと思いますが。 あるいは、テーブルAのデータを全部配列に読み込んで、closeしてから、テーブルBの処理をする 等が考えられます。

Elldorado
質問者

お礼

  返答ありがとうございます。 対策例まで書いて頂き助かります。 1つのコネクションで並行して2つ以上のレコードセットを使用できない →わたしが質問で記述したソースはそのままでは実現できない ということで理解しました。 ちなみに、対策1のようにコネクションを2つ使用する場合、 BeginTrans、CommitTrans、RollbackTransもそれぞれ2つずつ記述が必要ということですよね? よろしくお願い致します。  

その他の回答 (2)

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.3

ANo.2です。 すいません。 "手動または分散トランザクションモードのため、新規接続を作成できません。" というエラーメッセージからみで、ちょっとごっちゃにしていました。 もし、MTSを使っておられるなら、トランザクション制御の命令は記述しません。 MTS側の設定で、トランザクション制御をサポートする指定にするだけです。 (IISやCOM+を使っているプログラムの場合。) MTSを使っていない場合でしたら、 objConnA.BeginTrans objConnB.BeginTrans 以下それぞれでトランザクション制御が必要です。

Elldorado
質問者

お礼

理解できました。 ありがとうございます。

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

ANo1です。 お礼の、 >ちなみに、対策1のようにコネクションを2つ使用する場合、 >BeginTrans、CommitTrans、RollbackTransもそれぞれ2つずつ記述が必要ということですよね? ですが、 MTSは分散トランザクションをサポートしているので1つで大丈夫です。 ## 分散トランザクションって何?って聞かれそうですが。 ## 簡単に言うと、複数のDBサーバ(複数の接続と言い換えてもいい)とのアクセスを ## 1つのトランザクションとしてまとめて処理できる機能とでも言えばいいかな。

Elldorado
質問者

お礼

お世話になっております。 ※返信が遅れてしまい申し訳ありません。 > MTSは分散トランザクションをサポートしているので1つで大丈夫です。 1つで大丈夫という事ですが、具体的には BeginTrans、CommitTrans の記述はどの様に書けば良いのでしょうか? 1.objConnA.BeginTrans ? 2.objConnB.BeginTrans ? 3.まったく別の記述? よろしくお願い致します。

関連するQ&A