vb6 - new - ¿Es necesario cerrar un objeto Adodb.recordset antes de configurarlo en nada?
vb6 ado recordset (3)
La única razón por la que se llama a Close
explícitamente es cuando no está seguro de si el conjunto de registros se referencia desde otro lugar en su proyecto, generalmente como resultado de una codificación descuidada.
Dim rs as ADODB.Recordset
Set rs = ReturnARecordset
...
MyControl.ObscureMethod rs
...
Set rs = Nothing
Se supone que la última línea termina la instancia del MyControl
registros sin llamar a Close
explícitamente, a menos que MyControl
tenga una referencia adicional y así MyControl
el desmontaje normal. Al llamar a Close
on rs
se asegurará de que MyControl
no pueda usar su referencia para nada útil, y mientras tanto se MyControl
en llamas.
Dim rs as ADODB.Recordset
set rs = ReturnARecordset ''assume ReturnARecordset does just that...
''do something with rs
rs.Close
set rs = Nothing
¿Es necesario llamar a rs.Close antes de configurarlo a nada?
Editar: Tenemos una conexión global que mantenemos abierta durante la aplicación y todos los objetos del conjunto de registros usan esta misma conexión. Veo dos respuestas a continuación sobre la necesidad de cerrar conjuntos de registros para garantizar que las conexiones no se dejen abiertas. Para mí, eso suena como una gran cantidad de conversaciones tontas porque las conexiones se controlan con objetos de conexión, no con objetos de conjunto de registros, ¿no? Pero, por favor, avíseme si me falta algo aquí ...
Puede encontrarse con problemas de agrupación de ODBC o OLEDB, que mantienen abierta una conexión y vinculan una ranura de grupo:
Las causas comunes de la fluencia de la conexión incluyen:
Los objetos ADO Connection y Recordset no están realmente cerrados. Si no los cierra de forma explícita, no se liberarán en el grupo. Esta es probablemente la causa más frecuente de creep de conexión.
Un objeto ADO que creó (especialmente un objeto Connection) no se publicó explícitamente. Liberar explícitamente los objetos que creas es una buena práctica de programación. Si asigna memoria, libérela. Dependiendo del idioma que esté utilizando, dejar que una variable salga del alcance puede o no dar como resultado que se lance.
Consulte Agrupar en los componentes de acceso a datos de Microsoft
Y si hay alguna posibilidad de que .Net Interop participe, tenga cuidado: hay muchas advertencias sobre problemas causados debido a la forma perezosa en que se produce el lanzamiento del objeto COM (u objeto contenido) en la recolección de basura de .Net.
Sí, esto hace más que solo forzar una recolección de basura, también le dice al servidor que la conexión se está terminando, esto evita tener múltiples conexiones abiertas huérfanas (eventualmente se desconectarán por sí mismas), pero siempre es una buena práctica cerrarlas.
Esto es especialmente evidente cuando ADODB está utilizando una conexión remota en lugar de una conexión local.