お世話になります。
開発言語:VisualBasic 6 sp6
OS :WindowsXP Pro sp3
DB :Microsoft SQL Server 2005
以下のコードはCommand1ボタンをクリックした時に実行される処理です。
処理内容は、テーブルAを読み、テーブルAの全てのレコードを順次読みながら
テーブルBを検索し、テーブルBの"keyname"をprintします。
※実際のプログラムではテーブルAを順次読むループの中で多数のテーブルへの
新規レコード追加、更新などを行っております。
Private Sub Command1_Click()
Dim objConn As ADODB.Connection
Dim objRsA As ADODB.Recordset
Dim objRsB As ADODB.Recordset
Dim sSQL As String
Set objConn = New ADODB.Connection
objConn.ConnectionString = cstrCon
objConn.Open
Set objRsA = New ADODB.Recordset
Set objRsB = New ADODB.Recordset
'トランザクション開始
objConn.BeginTrans
sSQL = "select * from テーブルA"
objRsA.Open strSQL, objConn
If objRsA.EOF = False Then
Do Until objRsA.EOF
sSQL = "select * from テーブルB where key = " & objRsA.Fields("key")
objRsB.Open strSQL, objConn '←この行でエラー発生
Print objRsB.Fields("keyname").Value
objRsB.Close
objRsA.MoveNext
Loop
End If
objRsA.Close
'コミット
objConn.CommitTrans
End Sub
↑の処理を実行すると「objRsB.Open strSQL, objConn」の行で以下の実行エラーになります。
"手動または分散トランザクションモードのため、新規接続を作成できません。"
このエラーの原因が分からず自分でもいろいろ調べてみました。
以下のサイトも何度も見直してみましたがよく理解できませんでした。
http://support.microsoft.com/kb/234218/ja
どこが間違っていて、どこを修正すればエラーが出なくなるのでしょうか?
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
には、
>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の処理をする
等が考えられます。
返答ありがとうございます。
対策例まで書いて頂き助かります。
1つのコネクションで並行して2つ以上のレコードセットを使用できない
→わたしが質問で記述したソースはそのままでは実現できない
ということで理解しました。
ちなみに、対策1のようにコネクションを2つ使用する場合、
BeginTrans、CommitTrans、RollbackTransもそれぞれ2つずつ記述が必要ということですよね?
よろしくお願い致します。
No.3
- 回答日時:
ANo.2です。
すいません。
"手動または分散トランザクションモードのため、新規接続を作成できません。"
というエラーメッセージからみで、ちょっとごっちゃにしていました。
もし、MTSを使っておられるなら、トランザクション制御の命令は記述しません。
MTS側の設定で、トランザクション制御をサポートする指定にするだけです。
(IISやCOM+を使っているプログラムの場合。)
MTSを使っていない場合でしたら、
objConnA.BeginTrans
objConnB.BeginTrans
以下それぞれでトランザクション制御が必要です。
No.2
- 回答日時:
ANo1です。
お礼の、
>ちなみに、対策1のようにコネクションを2つ使用する場合、
>BeginTrans、CommitTrans、RollbackTransもそれぞれ2つずつ記述が必要ということですよね?
ですが、
MTSは分散トランザクションをサポートしているので1つで大丈夫です。
## 分散トランザクションって何?って聞かれそうですが。
## 簡単に言うと、複数のDBサーバ(複数の接続と言い換えてもいい)とのアクセスを
## 1つのトランザクションとしてまとめて処理できる機能とでも言えばいいかな。
お世話になっております。
※返信が遅れてしまい申し訳ありません。
> MTSは分散トランザクションをサポートしているので1つで大丈夫です。
1つで大丈夫という事ですが、具体的には BeginTrans、CommitTrans の記述はどの様に書けば良いのでしょうか?
1.objConnA.BeginTrans ?
2.objConnB.BeginTrans ?
3.まったく別の記述?
よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
ADO Connection を再利用する方法
SQL Server
-
【DB】同じトランザクション内でupdateとselectをしたときの結果値
その他(データベース)
-
トランザクションの開始
Visual Basic(VBA)
-
-
4
一つのトランザクションでSELECTとUPDATEできますか? (ADO.NET)
SQL Server
-
5
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
6
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
-
7
ADO VBA 実行時エラー3021
Visual Basic(VBA)
-
8
データベース操作時エラーについて
Visual Basic(VBA)
-
9
Accessの実行時エラーについて
その他(データベース)
-
10
access でエラーを回避するには?
Access(アクセス)
-
11
SQL Server時間切れについて
SQL Server
-
12
意味不明の実行時エラーで困っています
その他(プログラミング・Web制作)
-
13
Accessでブレークポイントを設定してないのに一時停止してしまう
その他(データベース)
-
14
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
15
CloseとDisposeの違い
Visual Basic(VBA)
-
16
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
17
Accessで数値型にNULLをInsertするとエラー
その他(データベース)
-
18
EXCELVBAでSQLserverからデータをひっぱってきてエクセルに表示させたい
Visual Basic(VBA)
-
19
変数名の付け方
Java
-
20
レコードを保存するコード アクセスvba
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
手動または分散トランザクショ...
-
COBOLのINVALID KEYが理解でき...
-
ADO&mdbで、リンクテーブルの...
-
MDBテーブルへの追加変更を教え...
-
エクセルのテーブルを解除する...
-
AccessVBAコミットとロールバッ...
-
VB.NET データセットとADOレコ...
-
Accessで別mdbのテーブルをコピー
-
他のMDBのテーブルに追加したい
-
配列のペースト出力結果の書式...
-
Excel VBAでフォルダ内の全テキ...
-
【C++/CLI】int型からString型...
-
VBA 変数名に変数を使用したい。
-
配列をランダムに並び替えても...
-
Access 2010で実行時エラー3061
-
INT64対応のprintf系関数はあり...
-
AccessのDAOでフィールド名を配...
-
Excelのメモリ(配列)の上限は2G...
-
access vba 『○○件づつ表示』を...
-
MSFlexGrid 行選択状態
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
『列名 '担当者CD' があいま...
-
SQLを発行とは?クエリの作成と...
-
VBとアクセスでSQL文に変...
-
Accessで別mdbのテーブルをコピー
-
手動または分散トランザクショ...
-
エクセルのテーブルを解除する...
-
CSVファイルのエクスポートでソ...
-
AccessからExcelへエクスポート...
-
HTMLのテーブルの行数が多くな...
-
ACCESS2010 実行時エラー 2766
-
ExcelVBAからAccessMDB内のテー...
-
Excel複数シートをaccessへ一括...
-
DataGridViewに複数テーブルの...
-
他のMDBのテーブルに追加したい
-
ワークテーブルの作成について
-
★クリスタルレポートの元になる...
-
COBOLのINVALID KEYが理解でき...
-
VBでコンボボックスとテキスト...
-
VB.NETでのAccessテーブルリンク
-
Accessのフォームでリス...
おすすめ情報