• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ADO Connection を再利用する方法)

ADO Connection を再利用する方法

このQ&Aのポイント
  • ADO Connection を再利用するための方法を紹介します。
  • VB .NET 2005 での ADO Connection の再利用に関するエラーについて解決方法を探っています。
  • VB.NET で ADO Connection を再利用する際にエラーが発生し、解決策を模索しています。

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

  • ベストアンサー
  • kero_mio
  • ベストアンサー率90% (94/104)
回答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 ご参考になれば、幸いです。

sarah_pico
質問者

補足

回答ありがとうございます。 参考にさせていただき、試してみました。 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文の発行以外での実現方法はあるのでしょうか。

その他の回答 (1)

  • kero_mio
  • ベストアンサー率90% (94/104)
回答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