2011-12-05 3 views
9
Dim rs as ADODB.Recordset 
set rs = ReturnARecordset 'assume ReturnARecordset does just that... 

'do something with rs 

rs.Close 
set rs = Nothing 

rs.Close를 호출해야만 아무 것도 설정하지 않아도됩니까?Adodb.recordset 개체를 닫고 아무것도 설정하지 않았습니까?

편집 : 우리는 응용 프로그램의 지속 기간 동안 열려있는 하나의 전역 연결을 가지며 모든 레코드 세트 개체는이 동일한 연결을 사용합니다. 연결이 끊어지지 않도록하기 위해 레코드 세트를 닫아야 할 필요성에 대해 아래에서 두 가지 대답을 봅니다. 연결 개체는 연결 개체로 제어되고 레코드 세트 개체는 올바르게 제어되지 않으므로 저에게는 바보 같은 말처럼 들립니다. 그러나 여기에 뭔가 빠졌는지 알려주세요.

답변

4

Close을 명시 적으로 호출하는 유일한 이유는 프로젝트의 다른 곳에서 레코드 세트가 참조되는지 확실하지 않은 경우입니다. 일반적으로 코딩이 엉성하기 때문입니다.

Dim rs as ADODB.Recordset 
Set rs = ReturnARecordset 
... 
MyControl.ObscureMethod rs 
... 
Set rs = Nothing 

마지막 라인은 MyControl이 추가 참조를 잡고있어 정상적인 눈물 다운을 방지하지 않는 한, 명시 적으로 Close를 호출하지 않고 레코드 인스턴스를 종료 할 예정이다. Closers으로 호출하면 MyControl이 유용한 참조를 사용할 수 없으며 그 동안에는 화염에 충돌합니다.

+0

내 생각을 정확하게. 나는 주로 그들이 작성된 함수에 비공개 인 레코드 세트 변수에 대해 Close 메소드를 호출하여 범위를 벗어나는 유효한 이유가 있는지를 파악하려고합니다. –

+2

'Close'를 호출하여 * local *을 'Nothing'으로 명시 적으로 설정하면 코드의 인터넷 욕실이 가득한 같은 Cargo Cult 프로그래밍의 일부입니다. 상식을 사용하면 특정 환경에서 누출을 테스트하는 것이 가장 좋습니다. – wqw

+0

그래, 어쨌든 범위를 벗어나려고 할 때 나는 아무것도 설정하지 않는다. 하지만 그 질문에 대한 것이 아니었을 때 아무것도 설정하지 않음의 중요성에 대한 여러 답을 듣고 싶지 않았습니다. 나는 그 주석을 막기 위해 그곳에 선을 긋습니다 :) –

4

예, 이것은 가비지 수집을 강제하는 것 이상으로 연결이 종료되었음을 서버에 알려주는 것입니다. 연결이 끊어져도 연결이 끊어지지 않습니다. 결국 시간 초과 될 것입니다.) 그러나 그것들을 종료시키는 항상 최선의 방법입니다.

ADODB가 로컬 연결이 아닌 원격 연결을 사용하는 경우 특히 그렇습니다.

+1

그건 의미가 없습니다. Recordset.Open은 연결 개체를 매개 변수로 사용하고 레코드 집합을 닫아도 연결이 닫히지 않습니다. 우리의 응용 프로그램에는 응용 프로그램이 실행되는 동안 열려있는 단일 연결 개체가 있으며 모든 쿼리는이 개체를 사용합니다. 그래서 염두에두고, 거기에 다른 이유는 레코드를 닫습니다? 레코드 세트의 참조 카운트가 0에 도달하면 Close가 소멸자에서 처리하는 것을 처리 할 것이라고 가정하지만, 그것이 내가 묻는 이유인지는 확실하지 않습니다. –

+0

즉, 레코드 세트를 나중에 아무것도 설정하지 않을 때 레코드 세트를 닫을 다른 이유가 있습니까 (명시 적으로 또는 범위를 벗어남) –

1

당신은 ODBC 또는 OLEDB로 연결을 열린 상태로 유지 풀링 문제를 실행하고 풀 슬롯 묶어 할 수 있습니다 연결 크리프의

일반적인 원인은 다음과 같습니다

ADO 연결 및 레코드의 객체가 실제로는 닫히지 않았습니다. 명시 적으로 닫지 않으면 풀로 해제되지 않습니다. 이것은 아마도 연결 크리프의 가장 빈번한 단일 원인 일 것입니다.

작성한 ADO 개체 (특히 연결 개체)가 명시 적으로 릴리스되지 않았습니다. 명시 적으로 객체를 해제하는 것은 좋은 프로그래밍 습관 일뿐입니다. 메모리를 할당하면 해제하십시오. 사용하는 언어에 따라 변수를 범위 밖으로 나가게하거나 해제 할 수 있습니다.

Pooling in the Microsoft Data Access Components을보고있는 경우 닷넷 상호 운용성의 기회가 조심 참여 : 인해 릴리스에서 발생 게으른 방법은 COM 객체 (또는 포함 된 개체)에 발생하는 문제에 대한 경고가 많이있다. Net의 가비지 수집.

+0

제 편집을보고 알려주세요. 여기에 뭔가를 놓친다면 ... –

+1

Recordset이 자체 Connection으로 열리지 않은 경우 풀링은 내가 아는 한 문제가되지 않습니다. – Bob77

+0

좋습니다. 나는 연결 개체를 통과 한 레코드 세트로만 작업했으며 솔직히 그렇게하지 않고 열 수 있다는 것을 기억하지 못했습니다. 감사. –

관련 문제