ADO連携時にCLI_ISOLATION_WAIT=(REJECT)を設定しているにもかかわらずエラー「JYP2099E」「JYP5014E」が取得できない場合の原因と対処について

ADO連携時、CLI_ISOLATION_WAIT=(REJECT)を設定していますが「JYP2099E デッドロックが発生しました.」および「JYP5014E スキーマ"~"の表"~"は占有中です.」のエラーが取得できません。
原因と対処方法を教えてください。
“Recordset.EOF”プロパティでカレント行がEOFかどうか確認後は、以下のエラーがアプリケーション側で認識できなくなります。

  • JYP2099E デッドロックが発生しました.
  • JYP5014E スキーマ"~"の表"~"は占有中です.

これらのエラーをアプリケーション側で認識するタイミングは、“Recordset.MoveFirst”メソッドを実行するか、データを参照した時です。
上記エラーを認識するためには、EOFプロパティを確認せずに“MoveFirst”メソッドの実行またはデータを参照してください。
ただし、SELECT文の検索結果が0件であった場合、Visual Basicの実行時エラーが発生します。
エラーについては、【デットロックエラーの取得例】を参考に切り分けを行ってください。

  • 実行時エラー"3021"
    BOFとEOFのどちらかがTrueになっているか、または現在のレコードが削除されています。
    要求された操作には、現在のレコードが必要です。


【デットロックエラーの取得例】

  1. On Errorステートメントを使用して、エラー処理ルーチンを設定する

  2. デットロックのエラーを認識するためにMoveFirstを実行

  3. 実行時エラー"3021"は無視する

  4. 実行時エラー"3021"以外のエラー情報を取得する


'オブジェクト宣言
Dim Con As Connection
Dim Rst As Recordset
Dim msgstr As String

'Connectionオブジェクトの生成と設定
Set Con = New Connection
Con.ConnectionString = "DSN=DSN01;UID=USER01;PWD=PASS01;"

'コネクション接続
Con.Open

'Recordsetオブジェクトの生成
Set Rst = New Recordset

'1.On Errorステートメントを使用して、エラー処理ルーチンを設定
On Error GoTo RstOpenErr

'Recordsetオブジェクトを開く
Rst.Open "SELECT * FROM CHAR_TBL WHERE C_KEY=1 FOR UPDATE", Con, _
          adOpenStatic, _
          adLockPessimistic, _
          adCmdText

'2.デットロックのエラーを認識するためにMoveFirstを実行
Rst.MoveFirst

On Error GoTo 0

Do Until Rst.EOF
     'データ取得文字列の初期化
     msgstr = ""
     '列数の取得
     For i = 0 To Rst.Fields.Count - 1
         'データの取得
         msgstr = msgstr & Rst.Fields(i).Value() & " "
     Next
     'メッセージボックスの表示
     MsgBox msgstr, vbOKOnly, "Recordset"
     '行の位置づけ
     Rst.MoveNext
Loop

EOF_END:

'Recordsetオブジェクトを閉じる
Rst.Close

'コネクション切断
Con.Close

'オブジェクトの破棄
Set Rst = Nothing
Set Con = Nothing

Exit Sub

'エラー処理
RstOpenErr:

'3.実行時エラー"3021"は無視する
If Err.Number = 3021 Then
     Err.Clear
     GoTo EOF_END
End If

'4.エラー情報を取得する
If Con.Errors.Count > 0 Then
     msgstr = msgstr & Con.Errors(0).Description & Chr(10)
     msgstr = msgstr & "SQLSTATE: " & Con.Errors(0).SQLState & Chr(10)
     Con.Errors.Clear
Else
     msgstr = msgstr & Err.Description
     Err.Clear
End If

MsgBox msgstr, vbOKOnly, "Error"
GoTo EOF_END
製品・サービス区分 Symfoware
製品・サービス情報
対象製品 Symfoware Server (Native Interface)
プラットフォーム Windows, Solaris, Linux
アンサー種別 運用/保守
このページの先頭へ