【環境】
OS:Windows Server 2003
DB:SQL Server 2005
言語:VB .NET 2005
現在、Windows2000Server + SQLServer2000 + VB6の環境を
上記の環境に移行しております。
ADO Connectionの再利用で
「手動または分散トランザクションモードのため、新規接続を作成できません」
というエラーが発生します。
いろいろと検索してみたのですが、解決せず、お力をお貸しいただきたいと思って投稿させていただきます。
現在のコードは、
--------------------------------------------
Public adoCn As ADODB.Connection
Public adoRs As ADODB.Recordset
Public Sub pfAutoClosed()
If fGet印刷ジャーナルファイルRecordset() = True Then
'*********************
'トランザクションの開始
'*********************
adoCn.BeginTrans()
'印刷ジャーナルファイルのロック
sMySQL = "SELECT * FROM 印刷ジャーナルファイル WITH (TABLOCKX)"
adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)
'職員表マスタのロック
sMySQL = "SELECT * FROM 職員表マスタ WITH (TABLOCKX)"
adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText) <---- ここでエラー発生
adoRs.MoveFirst()
Do Until adoRs.EOF
iKubun = nz(adoRs.Fields("区分").Value)
'*****************
'1.職員表マスタの作成
'*****************
'SQLステートメントを作成
sMySQL = "INSERT INTO 職員表マスタ (~以下省略)"
adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)
'**************************
'2.更新区分に更新フラグを設定
'**************************
sMySQL = "UPDATE 印刷ジャーナルファイル " & "SET 更新区分 = 1 (~以下省略)"
adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)
adoRs.MoveNext()
Loop
adoCn.CommitTrans() 'トランザクション処理のコミット
adoRs.Close()
adoRs = Nothing
endif
End Sub
'*****************************************
'印刷ジャーナルファイルのレコードセットを取得
'*****************************************
Private Function fGet印刷ジャーナルファイルRecordset() As Boolean
adoRs = New ADODB.Recordset
With adoRs
.let_Source("SELECT * FROM 印刷ジャーナルファイル " & "WHERE 発行区分 = 1 AND 更新区分 = 0")
.let_ActiveConnection(adoCn)
.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
.LockType = ADODB.LockTypeEnum.adLockPessimistic
.Open()
End With
If adoRs.EOF Then
fGet印刷ジャーナルファイルRecordset = False
Else
fGet印刷ジャーナルファイルRecordset = True
End If
End Function
--------------------------------------------
となっています。
pfAutoClosed関数内で、同じadoCnを使用しての2度目のSELECT文が実行できません。
ADO Connectionの再利用ができないということで、「Close」をしてくださいという記述を参考にもしたのですが、解決しておりません。
トランザクション開始位置も変更してみたのですが、だめでした。
VB->VB.NETへのアップグレードウィザードを使用したのですが、移行以前のVB6のバージョンではエラーなく動作します。
間違っている点をご指南いただければと思います。
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
問題の原因だと思われる箇所が2つあります。
・fGet印刷ジャーナルファイルRecordsetで定義しているadoRsの
レコードセットがCloseされていない
・adoCn.BeginTrans()の開始が早すぎる。
adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)の
後に、adoCn.BeginTrans()すべきです。
なので、纏めると
Public adoCn As ADODB.Connection
Public adoRs As ADODB.Recordset
Public Sub pfAutoClosed()
If fGet印刷ジャーナルファイルRecordset() = True Then
'印刷ジャーナルファイルのロック
sMySQL = "SELECT * FROM 印刷ジャーナルファイル WITH (TABLOCKX)"
adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)
'職員表マスタのロック
sMySQL = "SELECT * FROM 職員表マスタ WITH (TABLOCKX)"
adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText) <---- ここでエラー発生
adoRs.MoveFirst()
'トランザクションの開始は、ここから行う
adoCn.BeginTrans()
Do Until adoRs.EOF
iKubun = nz(adoRs.Fields("区分").Value)
'*****************
'1.職員表マスタの作成
'*****************
'SQLステートメントを作成
sMySQL = "INSERT INTO 職員表マスタ (~以下省略)"
adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)
'**************************
'2.更新区分に更新フラグを設定
'**************************
sMySQL = "UPDATE 印刷ジャーナルファイル " & "SET 更新区分 = 1 (~以下省略)"
adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)
adoRs.MoveNext()
Loop
adoCn.CommitTrans() 'トランザクション処理のコミット
adoRs.Close()
adoRs = Nothing
endif
End Sub
'*****************************************
'印刷ジャーナルファイルのレコードセットを取得
'*****************************************
Private Function fGet印刷ジャーナルファイルRecordset() As Boolean
adoRs = New ADODB.Recordset
With adoRs
.let_Source("SELECT * FROM 印刷ジャーナルファイル " & "WHERE 発行区分 = 1 AND 更新区分 = 0")
.let_ActiveConnection(adoCn)
.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
.LockType = ADODB.LockTypeEnum.adLockPessimistic
.Open()
End With
If adoRs.EOF Then
fGet印刷ジャーナルファイルRecordset = False
Else
' 必ずCloseする
adoRs.Close()
fGet印刷ジャーナルファイルRecordset = True
End If
' Nothingを必ず入れる
Set adoRs = Nothing
' または、 Set文なしで、adoRs = NothingでもOKかも?
End Function
ご参考になれば、幸いです。
この回答への補足
回答ありがとうございます。
参考にさせていただき、試してみました。
1.fGet印刷ジャーナルファイルRecordsetで定義しているadoRsの
レコードセットがCloseされていない
→これについてはadoRsの値をpfAutoClosed()で使用している
ため、fGet印刷ジャーナルファイルRecordset()内でClose
することができません。
実際には、pfAutoClosed()のEnd Sub3行前でCloseして
います。
2.adoCn.BeginTrans()の位置を変更する
→adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)
の後にadoCn.BeginTrans()を変更した場合、
一つ目のadoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)
のところでフリーズしてしまい動かなくなります。
ややこしくて申し訳ありませんが、見落としている点ありましたらご教授ください。
それと、印刷ジャーナルファイルと職員表マスタのロックが必要なのですが、このようなSELECT文の発行以外での実現方法はあるのでしょうか。
No.2
- 回答日時:
>1.fGet印刷ジャーナルファイルRecordsetで定義しているadoRsの
>レコードセットがCloseされていない
> →これについてはadoRsの値をpfAutoClosed()で使用している
> ため、fGet印刷ジャーナルファイルRecordset()内でClose
> することができません。
> 実際には、pfAutoClosed()のEnd Sub3行前でCloseして
> います。
どういうトランザクション単位で、処理したいのでしょうか?
まずはそこからですね。
別に、adoRsは、pfAutoClosed()用と、fGet印刷ジャーナルファイルRecordset()用と
2種類のRecordsetを定義しても問題はないですよね?
また、Connection(adoCn)についても同じことです。
「○○で使用しているからできません」ではなく、
「トランザクションの単位」がこうなっているから、ここは別けられないと
いう説明がない限り、具体的な解決案を出せませんので、
SELECT系と更新(INSERT, UPDATE, DELETE)のトランザクションは
どういうくくりで処理したいのでしょうか?
そこを補足ください。
>2.adoCn.BeginTrans()の位置を変更する
> →adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)
> の後にadoCn.BeginTrans()を変更した場合、
> 一つ目のadoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)
> のところでフリーズしてしまい動かなくなります。
フリーズするとは、どのような現象でしょうか?どのようなエラーが出ますか?
また、先ほども申し上げた通り、処理したいトランザクションの単位がわからなければ、
adoCn.BeginTrans() の書く位置もまた変わってきますので、
「処理したいトランザクション単位」を教えてください。
ただ、見ている限り、SELECT系と更新系のConnection(adoCnを2種類)と
トランザクション(adoCnを2種類用意するとトランザクションは別けられます)は
わけてしまっても問題無いようには、見えます。
もう少し情報を精査して頂き、「エラーになるから」ではなく、最終的に何ができればいいのか?
の情報をお寄せ頂けると幸いです。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
手動または分散トランザクションモード…のエラー
Visual Basic(VBA)
-
一つのトランザクションでSELECTとUPDATEできますか? (ADO.NET)
SQL Server
-
SQLで同じDBに対し2つのコネクションをもてる?
SQL Server
-
-
4
Hideについて(.NET)
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【DB】同じトランザクション内...
-
dbFailOnError とは?
-
警察はスマホに保存した動画や...
-
復旧中のデータベースについて
-
ポストグレにあるExcelファイル...
-
Sqliteで使えない文字。
-
PCが悪くなって新しいPCにSSMS...
-
データベース
-
datファイルとは?
-
oracleデータベースの更新履歴
-
SQL-Server2000でトランザクシ...
-
ログファイルの圧縮がされずに...
-
mdfファイルの残骸について
-
SQL*Loaderのコミットポイント...
-
SQL Server 2005のbcpについて
-
accessの上限容量2Gでは容量が...
-
ファイルメーカーで画像を参照...
-
SQL Server Management Studio ...
-
1回目の実行に3分、2回目の実行...
-
DATファイルをEXCELで開きたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
一つのトランザクションでSELEC...
-
dbFailOnError とは?
-
Accessdでの「トランザクション...
-
TPSとは・・・
-
ADO Connection を再利用する方法
-
SQL Server 2005トランザクショ...
-
OracleのROWIDについて…
-
SAPのSPROって何の略ですか?
-
SQLserver2000のレプリケーショ...
-
汎用系システムのDBについて
-
PostgreSQLのクラスタ運用について
-
PHP-オラクルでのトランザクション
-
トランザクションの肥大化
-
MySQLとPostgleSQL、ど...
-
BitcoinコアはPolygonチェーン...
-
Sql Server 2005 でデータ抜け...
-
FirebirdへのDelphiによるデー...
-
トランザクション
おすすめ情報