2010-03-30 28 views
12

często znajduję to mylące, do kiedy należy użyć:Jaka jest różnica między rs.Close vs rs = Nothing w zestawie rekordów

rs.Close 

przeciwieństwie do

Set rs = Nothing 

mogę zrozumieć konieczności zamknięcia połączenia ze źródłem, ale czy powinienem używać obu, gdy zmienna nie mieści się w zasięgu?

Czy mogę po prostu ustawić zmienną na Nothing w celu pominięcia kroku zamknięcia połączenia? Czy byłoby to uważane za złą praktykę?

Odpowiedz

11

Za pomocą metody "Zamknij" zamykasz połączenie z bazą danych, ale wciąż znajduje się w pamięci, gdzie można ponownie otworzyć za pomocą metody "Otwórz".

Ustawienie zestawu rekordów na "Nic" z drugiej strony zwalnia obiekt całkowicie z pamięci.

+0

Więc, czy robi jeden ominąć zapotrzebowanie na ten drugi? –

+0

Naprawdę, chociaż można pominąć ustawienie zestawu rekordów na nic i nie napotka żadnego błędu. Po prostu jest to najlepsza praktyka, aby ustawić rekorsenera na nic po zamknięciu, szczególnie gdy nie masz żadnego zastosowania do tego zestawu rekordów lub nie będziesz mieć dostępu do tego samego zestawu rekordów ponownie. –

+2

Twoja odpowiedź dotyczy połączeń z bazą danych, ale pytanie dotyczyło zestawu rekordów. Zmienne bazy danych różnią się od innych tym, że to, co można bezpiecznie z nimi zrobić, zależy od sposobu ich zainicjowania (CurrentDB vs. DBEngine (0) (0)). Przy zmiennej zestawu rekordów zamykanie zestawu rekordów nie powoduje całkowitego zamknięcia połączenia z bazą danych. –

7

Metoda Zamknij rozrywa strukturę pamięci.

Ustawienie zmiennej na Nothing usuwa wskaźnik do tej struktury pamięci.

Teoretycznie, wyczyszczenie wskaźnika powinno zwolnić pamięć, do której odnosi się wskaźnik, ponieważ VBA używa licznika odwołań do określenia, kiedy może zwolnić pamięć. Niestety, różne rzeczy mogą się nie udać, a licznik odniesień może się skończyć z bicia, a pamięć nie zostanie zwolniona nawet wtedy, gdy powinna.

Tak więc, aby upewnić się, że nie podlegają wyciekom pamięci ani dziwnym rodzajom błędów spowodowanym przez niejawne i niewydane referencje, zarówno Zamknij, jak i ustaw na Nic.

5

Można ustawić rekordów do niczego bez potrzeby zwoływania Zamknij, według oficjalnej dokumentacji:

Alternatywą ścisłej metody jest ustawić wartość zmiennej obiektu do Nothing (Set dbsTemp = Nothing) .

Więcej informacji: Recordset.Close Method (DAO)