2010-03-30 2 views
12

레코드 세트 RS 대 rs.close = 아무것도의 차이 :무슨 나는 종종 혼란이 사용하는 것이 적합한 경우에로 찾을

rs.Close 

반대로 내가 이해할 수

Set rs = Nothing 

에 소스에 대한 연결을 닫을 필요가 있지만 변수가 범위를 벗어 났을 때 둘 모두를 사용해야합니까?

연결을 종료하는 단계를 건너 뛰려면 변수를 Nothing으로 설정할 수 있습니까? 이것이 나쁜 습관으로 간주 될 것인가?

답변

11

"닫기"방법을 사용하면 데이터베이스에 대한 연결이 닫히지 만 "열기"방법을 사용하여 다시 열 수있는 메모리에 남아 있습니다.

반면에 레코드 세트를 "없음"으로 설정하면 개체가 메모리에서 완전히 해제됩니다.

+0

그래서, 하나 개의 우회 다른 작업을 수행하는 필요성을하고 있습니까? –

+0

실제로 레코드 세트를 설정하지 않아도 오류가 발생하지는 않지만 실제로는 그렇지 않습니다. 그 레코드 세트를 사용하지 않거나 다시 같은 레코드 세트에 액세스하지 않을 때 특히 닫은 후에는 recset을 아무 것도 설정하지 않는 것이 가장 좋습니다. –

+2

귀하의 답변은 데이터베이스 연결을 참조하지만 질문은 레코드 세트를 사용했습니다. 데이터베이스 변수는 초기화 된 방법에 따라 안전하게 수행 할 수 있다는 점에서 다른 점과 다릅니다 (CurrentDB와 DBEngine (0) (0)). 레코드 세트 변수를 사용하면 레코드 세트를 닫아도 데이터베이스 연결이 전혀 닫히지 않습니다. –

7

Close 메서드는 메모리 구조를 찢어 버립니다.

변수를 Nothing으로 설정하면 해당 메모리 구조에 대한 포인터가 지워집니다.

이론적으로 포인터를 지우는 것은 VBA가 메모리를 해제 할 수있는시기를 결정하기 위해 참조 계산을 사용하기 때문에 포인터가 참조하는 메모리를 해제해야합니다. 불행하게도, 여러 가지 일이 잘못 될 수 있으며 참조 횟수가 끝나갈 수 있으며 메모리는 해제되어야합니다.

따라서 메모리 누수가 없거나 암시 적 또는 출시되지 않은 참조로 인해 발생하는 이상한 종류의 버그가 발생하지 않도록 Nothing으로 설정하면됩니다.

5
당신은 공식 문서에 따르면, 닫기를 호출 할 필요없이 Nothing으로 레코드를 설정할 수 있습니다

:

닫기 방법에 대한 대안은 아무것도에 개체 변수의 값을 설정하는 것입니다 (설정 dbsTemp = 아무것도) .

더 많은 정보는 : Recordset.Close Method (DAO)

관련 문제