DAOレコードオブジェクトの接続状態を取得するには?

解決


しらたま  2003-08-11 22:31:46  No: 78978

現在、Accessで開発を行っているのですが
簡単なエラー処理を含める際に、DAOオブジェクトの後始末について困っています。

下記のようなコードを書いた際に途中でエラーが発生し、
そのエラーが発生した個所ですでに"objREC"や"objDB"が解放されてしまっている場合
当然ですが、エラー処理の部分で再度解放しようとするので、エラーが発生します。

オブジェクトの解放忘れをなくしたいので
出来る限り、エラー処理の中で解放をしたいので
各オブジェクトの、現在の接続状態を知ることが出来れば
エラー処理の中で、もし、"objREC"が解放されていなければ、解放
解放されていれば、再度解放はしない、と考えたのですが
そういうプログラムは不可能でしょうか?

Public Function CheckConnection() As Long
    
    ' オブジェクト宣言
    Dim objDB           As DAO.Database
    Dim objREC          As DAO.Recordset
    
    ' エラートラップ開始
    On Local Error GoTo ERR_CheckConnection:
    
    ' DBオブジェクト初期化
    Set objDB = CurrentDb()
    
    ' レコード取得
    strSQL = "SELECT * FROM テストテーブル"
    Set objREC = objDB.OpenRecordset(strSQL)
    
    ' ここで何しかの処理をする
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

    Call objREC.Close
    Call objDB.Close
    Set objREC = Nothing
    Set objDB = Nothing
    
    On Local Error GoTo 0:
    
Exit Function

' エラー処理 ---------------------
ERR_CheckConnection:
    
    ' エラーメッセージ表示
    Call ErrMsgBox(Err.Description, "CheckConnection")
    
    Call objREC.Close
    Call objDB.Close
    Set objREC = Nothing
    Set objDB = Nothing
    
End Function


クリリン  2003-08-11 22:36:01  No: 78979

if isnothing(objREC) = false then
  Call objREC.Close
end if
とすれば、宜しいのでは?


しらたま  2003-08-11 23:01:44  No: 78980

クリリンさん、即レスありがとうございます。

>if isnothing(objREC) = false then
>  Call objREC.Close
>end if
>とすれば、宜しいのでは?

とのことですが
"isnothing"は
関数が定義されていない、とエラーが出てしまいました。
ざっとネットで調べてみましたが、.NET用でしょうか?
それとも、参照設定か何かで追加すれば使えるようになりますか?


しらたま  2003-08-11 23:02:32  No: 78981

追記です。

開発環境は、Access2000です。
書き遅れました。


しらたま  2003-08-11 23:17:40  No: 78982

先ほどのクリリンさんの書き込みで  ちょっと調べてみて

If Not objDB Is objDB Then
End If

であれば、Nothingされているかどうか、の状態は取得できましたが
Closeされているかどうか?の状態までは取得できませんでした。

恐らくVBなので
わざわざ

call objDB.Close
set objDB=Nothing

としなくても、Closeしてくれるのかもしれませんが、、、、
できれば明示的にCloseしたいのですが


クリリン  2003-08-11 23:36:31  No: 78983

ごめんなさい。IsNothingはVB.NET版でした。
VBAでの説明に切り替えます。
私の場合は、
エラー発生時にDBがOpenしている場合はClose処理を施していますが、
Openする前にエラーが発生した場合は、Nothingだけ入れるようにしています。
まぁ、そもそも、Openしていないので、オブジェクトは生成されていませんから、Closeのしようがありませんので・・・


クリリン  2003-08-11 23:41:07  No: 78984

追記
よって、Nothingチェックできるのであれば、
If (Not objREC Is Nothing) Then
  Call objREC.Close
end if
として、良いのではないでしょうか?


クリリン  2003-08-11 23:41:49  No: 78985

昔のソースを引っ張りだしてみたら、やっぱり、そうしていました。


しらたま  2003-08-11 23:50:05  No: 78986

クリリンさん、度々即レスありがとうございます。

>まぁ、そもそも、Openしていないので、オブジェクトは生成されていませんから、>Closeのしようがありませんので・・・

確かに、おっしゃる通り  うっかりしていました。
私の書き方だと、"Open"という動作がなく
"Set"すればオープンしているも同然なので

If (Not objREC Is Nothing) Then
  Call objREC.Close
end if

これでいけますね。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加