3

クラシックASPアプリケーションでASP_0147エラーが発生しているお客様がいます。私が最初にチェックしているのは、SQL/ADOリソースをタイムリーに閉じて解放していることです。

彼らのコードは次のパターンを持っています:

Function GetXXXXRecordSet()
  Set objConn = Server.CreateObject("ADODB.Connection")
  With objConn 
    .CursorLocation = 3 ''adUseServer (default)
    .ConnectionString = strConnectionString
    .Open
  End With

  Set objCmd = Server.CreateObject("ADODB.Command")
  Set objCmd.ActiveConnection = objConn

  '' Build command object to call SQL stored proc, snipped for brevity

  Set objRs = Server.CreateObject("ADODB.RecordSet")
  objRs.Open objCmd, ,3,4 '' Cursor=adOpenStatic, Locktype=adLockBatchOptimistic

  '' Return Recordset
  Set GetXXXXRecordSet = objRs

  If Not objCmd Is Nothing Then
    objCmd.ActiveConnection = Nothing  '' Should this use a Set statement?
    Set objCmd = Nothing
  End If
  If Not ObjRs Is Nothing The Set objRs = Nothing
End Function

ADOコマンドのActiveConnection=Nothingを設定すると、基になるSQL接続が閉じられますか、それとも明示的に閉じる必要がありますか?

また、次の行が必要です。

objCmd.ActiveConnection = Nothing

なれ:

Set objCmd.ActiveConnection = Nothing

奇妙なことに、最初のバージョンはエラーを生成しないので、私は尋ねます。

ADOを見てから久しぶりで、知識が少し錆びています。

4

5 に答える 5

5

私の理解では、 への設定ActiveConnectionNothing接続を閉じず、そのオブジェクトから削除しただけでした。これは、レコードセットの読み取り専用の固定スナップショットが必要なレコードセットなどに役立ちます (正しいカーソルオプションの設定と組み合わせて)。その Recordset の接続を維持する必要はありません (ただし、他の操作のために接続を開いたままにしておく必要がある場合があります)。

私の知る限り、実際に呼び出すだけobjConn.Closeで接続が閉じSet objConn = Nothingられ、メモリが解放されます

于 2010-03-04T16:06:34.223 に答える
2

ADODB RS + CONN を閉じる:

objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing

そうあるべきです: Set objCmd.ActiveConnection = Nothing

GL!

ソース:

http://www.aspwebpro.com/tutorials/asp/dbconnectionclose.asp

于 2010-03-03T14:09:51.940 に答える
2

これにはしばらく時間がかかりましたが、オブジェクトをクリアするだけで何も設定しませんでした。SQL Server を監視していれば、接続が終了していないに違いありません。

于 2010-03-03T14:11:20.897 に答える
1

VBScript はガベージ コレクトされ、GC のタイミングに関して非常に明確で明示的な保証さえ提供します。関数の最後で同じことが行われ、GC がオブジェクトをクリーンアップするため、スコープ外になる直前にローカル変数を何も設定しないのは完全に冗長です。

唯一の問題は、ADODB.Connection のデストラクタがデータベース リソースを解放するかどうかです。私はそれができると99%確信しています。その場合、Connection オブジェクトをスコープ外に出すだけで、関連付けられているすべてのリソースが解放されます。

于 2010-05-28T18:04:28.480 に答える
0

はい、オブジェクトを何も設定しないと、'Set' を使用してメモリが解放されることは正しいです...

objCmd.ActiveConnection = Nothing を設定します。

お役に立てれば。

于 2010-03-03T14:08:47.110 に答える