2010-03-03 7 views
3

Classic ASP 응용 프로그램에서 ASP_0147 오류가 발생하는 고객이 있습니다. 가장 먼저 체크하고있는 것은 SQL/ADO 리소스를 닫고 공개하는 것입니다.ADO 명령의 ActiveConnection = Nothing으로 기본 SQL 연결을 닫지 않습니까?

그들의 코드는 다음과 같은 패턴이 있습니다

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 = 아무것도 설정하지 않는 기본 SQL 연결 또는 명시 적으로 폐쇄 할 필요가 않습니다?

또한해야 라인 :

objCmd.ActiveConnection = Nothing 

될 :

Set objCmd.ActiveConnection = Nothing 

가 이상하게 첫 번째 버전은 내가 왜 물어 오류를 생성하지 않습니다.

내가 ADO를보고 내 지식이 다소 녹슬었기 때문에 오래되었습니다.

+0

다음과 같아야합니다. objCmd를 설정하십시오.ActiveConnection = Nothing really – Younes

+0

@Kev : 연결을 추가했는지 궁금합니다. 위의 코드를 닫으면 문제가 해결됩니까? – AnthonyWJones

+0

@AnthonyWJones - 추천을 고객에게 돌려주었습니다. 이제 기다려보아야합니다. – Kev

답변

4

내 이해는 항상 ActiveConnection에서 Nothing으로 연결을 닫지 않았다.이 개체는 해당 레코드를 제거한 고정 된 읽기 전용 스냅 샷이 필요한 Recordset과 같은 항목에 유용합니다 (커서 옵션 올바른) 등 AFAIK 실제로 objConn.Close 전화 연결)

을 그 레코드 살 (하지만 다른 작업에 대한 열린 여전히 연결을해야 할 수도 있습니다 보관할 필요가없는 연결을 닫고 Set objConn = Nothing는 메모리를 해제

+0

그것이 내가 생각한 것입니다. 단지 확인하고 싶었습니다. – Kev

+0

MSDN 문서를 다시 읽고 사용하는 문구는 다음과 같습니다. "... 명령 개체와 현재 연결의 연결을 끊습니다." – Kev

0

예, 당신은 ...이 도움이

 
Set objCmd.ActiveConnection = Nothing 

희망 아무것도 객체의 설정은 '설정'을 사용하여 메모리를 해제하는 것이 정확합니다.

+0

그러나 기본 SQL 연결도 정리할 수 있습니까? – Kev

+0

@Kev : 그렇습니다. 정리해도됩니다 ... 'objCmd.ActiveConnection'에 의해 점유 된 메모리를 확보하고 있기 때문에 'Set objCmd = Nothing'도 신중해야합니다! – t0mm13b

+0

아니요, ActiveConnection을 Connection 객체에 대한 객체 참조를 지우는 것으로 설정하면 실제 객체가 지워지지 않습니다. – RobV

2

모든이에 대한 오랜만 있었으나 결국 객체를 취소 아무것도로 설정하지 않을 것입니다. SQL Server를 모니터링하면 연결이 종료되지 않습니다.

+0

그 점도 제가 생각하기에 단지 확인하기를 원했던 것입니다. – Kev

1

VBScript는 가비지 수집되어 매우 명확합니다. GC의 타이밍과 관련하여 명시 적으로 보장됩니다. 범위를 벗어나기 전에 로컬 변수를 아무것도 설정하지 않으면 함수의 끝이 똑같은 일을하고 GC가 객체를 정리하기 때문에 완전히 중복됩니다.

유일한 질문은 ADODB.Connection의 소멸자가 데이터베이스 리소스를 해제하는지 여부입니다. 나는 그것이 99 % 확신합니다. 그렇다면 Connection 객체가 범위를 벗어나게하는 것만으로 모든 관련 리소스를 확보 할 수 있습니다.