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

解決


しらたま  2003-08-11 22:31:46  No: 78978  IP: [192.*.*.*]

現在、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  IP: [192.*.*.*]

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

編集    削除
しらたま  2003-08-11 23:01:44  No: 78980  IP: [192.*.*.*]

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

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

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

編集    削除
しらたま  2003-08-11 23:02:32  No: 78981  IP: [192.*.*.*]

追記です。

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

編集    削除
しらたま  2003-08-11 23:17:40  No: 78982  IP: [192.*.*.*]

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

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  IP: [192.*.*.*]

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

編集    削除
クリリン  2003-08-11 23:41:07  No: 78984  IP: [192.*.*.*]

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

編集    削除
クリリン  2003-08-11 23:41:49  No: 78985  IP: [192.*.*.*]

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

編集    削除
しらたま  2003-08-11 23:50:05  No: 78986  IP: [192.*.*.*]

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

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

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

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

これでいけますね。

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

編集    削除