2009-01-22 13 views
9

¿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.¿SqlDataAdapter.Dispose en realidad cierra una SqlConnection asociada?

Respuesta

10

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

Desde el .Fill() docs:

El objeto de conexión asociado con la instrucción SELECT debe ser válido, pero no tiene que estar 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.

El .Update() docs no menciona nada sobre la conexión en absoluto, por lo que esperaría tener que administrarlo manualmente.

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

Por último, podemos mejorar el código de Bob King poco como esto:

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 es 100% me dio la sintaxis de inicialización para el adaptador correcto, pero mecanografiado directamente en la ventana de respuesta. Lo arreglaré más tarde si es necesario.

+0

Hmm, Joel, nunca he dicho que pueda declarar varios ID identificables en la misma declaración de uso. ¡Eso es bastante astuto! –

+0

Además, creo que la versión de C# de los inicializadores de objetos no usa un "." http://weblogs.asp.net/dwahlin/archive/2007/09/09/c-3-0-features-object-initializers.aspx –

0

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

1

Por lo que sé, no es así. Yo uso anidado Uso de declaraciones para lograr esto, crear la conexión en primer lugar, a continuación, crear el adaptador y, como los que usan declaraciones "pop", se dispone el adaptador, la conexión está dispuesto, que hace gatillo de su fin:

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 el idioma de su elección.

Cuestiones relacionadas