.net ado.net

.net - ¿SqlDataAdapter.Dispose realmente cierra una SqlConnection asociada?



ado.net (3)

Lo primero que debes tener en cuenta es que DataAdapter administra y cierra tu conexión en algunas circunstancias. Por ejemplo, si está utilizando un DataAdapter, probablemente esté operando en DataTables / DataSets usando las funciones .Fill () y .Update ().

De los documentos .Fill () :

El objeto de conexión asociado con la instrucción SELECT debe ser válido, pero no es necesario que esté abierto. Si la conexión se cierra antes de que se llame a Fill, se abre para recuperar datos, luego se cierra. Si la conexión está abierta antes de que se llame a Fill, permanece abierta.

Los documentos .Update () no mencionan nada acerca de la conexión, por lo que esperaría tener que administrarla manualmente.

Ahora ha preguntado específicamente sobre el método Dispose (). Al igual que la Actualización, los documentos Dispose () no mencionan específicamente la conexión, por lo que esperaría tener que cerrarla manualmente.

Finalmente, podemos mejorar el código de Bob King de la siguiente manera:

Using conn as New SqlConnection(""), _ adapter as New SqlDataAdapter() With {.Connection = conn} ''Do stuff End Using

O en C #:

using (SqlConnection conn = new SqlConnection("")) using (SqlDataAdapter adapter = new SqlDataAdapter() {Connection = conn}) { // Do stuff }

No al 100% Obtuve la sintaxis de inicialización para el adaptador correcto, pero lo escribí directamente en la ventana de respuesta. Lo arreglaré más tarde si es necesario.

¿Alguien sabe si el método SqlDataAdapter.Dispose realmente cierra o elimina cualquier SqlConnections? Cargué Reflector y veo que SqlDataAdapter hereda de DbDataAdapter. Si desensamblo y miro el método de disposición en esa clase, parece que no hay disposición de ninguna SqlConnections. Supongo que podría escribir una prueba para esto, pero pensé que pediría ver si alguien tenía alguna idea sobre esto.


Hasta donde yo sé, no es así. Utilizo declaraciones de uso anidadas para lograr esto, primero creo la conexión, luego creo el adaptador y como las instrucciones de uso son "pop", el adaptador está Dispuesto, entonces la conexión está Dispuesta, lo que activa un cierre:

Using conn as New SqlConnection("") Using adapter as New SqlDataAdapter() With {.Connection = conn} ''Do stuff'' End Using End Using

La sintaxis es prácticamente idéntica para C #, si ese es su idioma de elección.


No, no elimina la conexión. Yo creo que no debería. Es posible que desee usarlo en otro lugar.