I often find it confusing as to when it is appropriate to use:
rs.Close
opposed to
Set rs = Nothing
I can understand needing to close a connection to a source, but should I be using both when the variable falls out of scope?
Can I just set the variable to Nothing in order to skip the step of Closing the connection? Would this be considered a bad practice?
The
Close
method tears down the memory structure.Setting the variable to
Nothing
clears the pointer to that memory structure.Theoretically, clearing the pointer should release the memory the pointer was referring to, because VBA uses reference counting for determining when it can release memory. Unfortunately, various things can go wrong and the reference count can end up out of whack, and memory won't be released even when it should be.
Thus, to be sure you're not subject to memory leaks, or the weird kinds of bugs caused by implicit and unreleased references, you both
Close
and set toNothing
.You can set Recordset to Nothing without needing to call Close, according to official documentation:
More info: Recordset.Close Method (DAO)
Well, in my own experience, if the recorset object(hereinafter referred to as "RS") is declared locally(within the function/procedure, hereinafter referred to as "B") and will not be delivered out to where B is called(hereinafter referred to as "A"), it's safe and suggested to close and set RS to nothing inside B; but in the following situations:
RS in B should only set to nothing without closing it, orelse the recordset object returned to A(or sent to B as one of the parameter(s) from A) will also be closed and set nothing, making it inaccessible in A, even if you returned RS to A in advance and then close in B!
By using the "Close" method you are closing the connection to the database but is still in the memory where you can open again using the "Open" method.
Setting the recordset to "Nothing" on the other hand releases the object completely from the memory.