2016-03-20 20 views
1

エラー処理について不思議でした。コードの実行中にエラーが発生し、レコードセットを開いている場合は、閉じる必要がありますか? recordset.close操作を試行するとエラーが発生する可能性があります。エラー処理コード部分の中にあるので、処理されないエラーになります。エラー処理でレコードセットにアクセスします

コードを送信して別のラベルで処理を続けると、無限ループになる可能性があります。このエラーが最初に表示されるかどうかを確認するためにブール値を1つ追加しても問題ありません。 コードが終了して閉じないと接続は開いたままになりますか?それは後でトラブルを引き起こすでしょうか?

Dim rs As DAO.Recordset 

Set rs = CurrentDB.OpenRecordset("SELECT * FROM tblSetting") 
On Error GoTo handler 

    'do things 

rs.Close 
Set rs = Nothing 

Exit Sub 

handler: 
rs.Close 
'Set rs = Nothing '-this one is not necessary, as terminating the sub should clear up all references to it, hence Garbage Collector can pick it up 
End Sub 

これは機能しますが、本当にですか?

... 
Termination: 
    rs.Close 
    Set rs = Nothing 
Exit Sub 

handler: 
if ErrorHappened=True then 
    msgbox "fatal error" 
    exit sub 
else 
    ErrorHappened=True 
    resume termination 
End If 

ありがとうございます!

答えて

2

はい、現在開いているレコードセットと接続を閉じることをお勧めします。何千もの理由があります:Pooling in the Microsoft Data Access Componentsこの記事では、私は、このようにコードを改善したいかなり古いですが、主なものは保たれている...

Exit_Subroutine: 
    On Error Resume Next 'ignore errors to be able to execute each line 
    If Not rst is Nothing Then rst.Close: Set rst = Nothing 
    'do the same for the connection object! 
    Exit Sub 

ErrorHandler: 
    MsgBox Err.Description, vbCritical, "Error" & Err.Number 
    Resume Exit_Subroutine 

あなたはあなたがするattampt前rstオブジェクトが何もないではないことを確認する必要がありそれを閉じます。

+0

さて、難しいのは、それでは...ありがとう! – vacip

+0

私はまだそれを直接エラーハンドラに入れませんでした...または何も設定されていない以外のレコードセットを閉じるときにエラーが発生する可能性がありますか? – vacip

+1

ありがとうございます。申し訳ありません、私は少し忙しかったです。コードに余分な行を追加し、エラーハンドラを改善しました。これは私が使用しているコードのかなりの部分です - 一般的な目的のためです。もちろん、特定のエラー番号を捕まえて処理するように変更できます。 –

1

VBAに自動ガベージコレクションがあります。 VBAコンパイラ内で何か問題が起こらない限り、すべてのオブジェクトはスコープ外に出ると解放されます。あなたの例:

Dim rs As DAO.Recordset 

'do things 
Exit Sub 

'do things 
End Sub 

... rsがEnd Subでリリースされ、自動的に閉じます。 (FWIW、コンパイルされたコードを調べることでこれを見ることができます)。

従来のASPにはこのようなスコープはなく、オブジェクトはスコープ外に出ることはなく、レコードセットは決して自動的に解放されませんでした。このため、すべてのMicrosoft VBAでは、EXPLICIT CLOSE AND RELEASEが表示されます。それはASPクラシックのためにそのようにしなければなりません。

あり、明示的なクローズを行うための2つの他の理由があるとリリース:

1)C/C++プログラマは自動メモリ管理を持っていません。オブジェクトを開いたままにしておくという考えで、彼らは恐怖と嫌悪感でいっぱいでした。これはコーディングスタイルです。

2)一部の人は、特定されていないエラー状態で、何らかの形で参照が残っていないローカルオブジェクトが自動的に正しく閉じられないと主張しています。私はそれを見たことがない。私はそれが文書化されて見たことがない。実際の具体例を読んだことはありません。しかし、ねえ、一部の人々はその主張をする:おそらくそれは本当です。

関連する問題