現在、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
if isnothing(objREC) = false then
Call objREC.Close
end if
とすれば、宜しいのでは?
クリリンさん、即レスありがとうございます。
>if isnothing(objREC) = false then
> Call objREC.Close
>end if
>とすれば、宜しいのでは?
とのことですが
"isnothing"は
関数が定義されていない、とエラーが出てしまいました。
ざっとネットで調べてみましたが、.NET用でしょうか?
それとも、参照設定か何かで追加すれば使えるようになりますか?
追記です。
開発環境は、Access2000です。
書き遅れました。
先ほどのクリリンさんの書き込みで ちょっと調べてみて
If Not objDB Is objDB Then
End If
であれば、Nothingされているかどうか、の状態は取得できましたが
Closeされているかどうか?の状態までは取得できませんでした。
恐らくVBなので
わざわざ
call objDB.Close
set objDB=Nothing
としなくても、Closeしてくれるのかもしれませんが、、、、
できれば明示的にCloseしたいのですが
ごめんなさい。IsNothingはVB.NET版でした。
VBAでの説明に切り替えます。
私の場合は、
エラー発生時にDBがOpenしている場合はClose処理を施していますが、
Openする前にエラーが発生した場合は、Nothingだけ入れるようにしています。
まぁ、そもそも、Openしていないので、オブジェクトは生成されていませんから、Closeのしようがありませんので・・・
追記
よって、Nothingチェックできるのであれば、
If (Not objREC Is Nothing) Then
Call objREC.Close
end if
として、良いのではないでしょうか?
昔のソースを引っ張りだしてみたら、やっぱり、そうしていました。
クリリンさん、度々即レスありがとうございます。
>まぁ、そもそも、Openしていないので、オブジェクトは生成されていませんから、>Closeのしようがありませんので・・・
確かに、おっしゃる通り うっかりしていました。
私の書き方だと、"Open"という動作がなく
"Set"すればオープンしているも同然なので
If (Not objREC Is Nothing) Then
Call objREC.Close
end if
これでいけますね。
ありがとうございました。
ツイート | ![]() |