2008-09-19 8 views
5

Si necesita abrir una SqlConnection antes de emitir consultas, ¿puede simplemente manejar todos los ConnectionStates no abiertos de la misma manera? Por ejemplo:Manejando diferentes ConnectionStates antes de abrir SqlConnection

if (connection.State != ConnectionState.Open) 
    { 
     connection.Open(); 
    } 

leí en alguna parte que para ConnectionState.Broken la conexión necesita ser cerrado antes de su re-abrió. ¿Alguien tiene experiencia con esto? Gracias-

Respuesta

5

http://msdn.microsoft.com/en-us/library/system.data.connectionstate.aspx

estado de conexión rota necesita ser cerrado y abierto de nuevo antes de elegibles para el uso continuo.

Editar: Desafortunadamente el cierre de una conexión cerrada también obstaculizará. Deberá probar el ConnectionState antes de actuar sobre una conexión desconocida. Tal vez una breve declaración de cambio podría hacer el truco.

4

Esto no está respondiendo directamente a su pregunta, pero la mejor práctica es abrir y cerrar una conexión para cada acceso a la base de datos. La agrupación de conexiones ADO.NET garantiza que esto funcione bien. Es particularmente importante hacerlo en aplicaciones de servidor (por ejemplo, ASP.NET), pero lo haría incluso en una aplicación de WinForms que accede directamente a la base de datos.

Ejemplo:

using(SqlConnection connection = new SqlConnection(...)) 
{ 
    connection.Open(); 
    // ... do your stuff here 

} // Connection is disposed and closed here, even if an exception is thrown 

De esta manera nunca se necesita para comprobar el estado de conexión al abrir una conexión.

+0

Usted no debe esperar a que el GC para cerrar y disponer de una conexión. Debería cerrar una conexión explícitamente una vez que haya terminado de usarla. – ddc0660

+0

La instrucción using garantiza que la conexión se cierre, incluso si se lanza una excepción. No espera a que el GC lo cierre. – Joe

+1

Este patrón de uso es el aspecto que debe tener el acceso a todos los datos. Nunca perderás conexiones de esta manera. Joe, también agregaría "using (Comando SqlCommand ..." dentro del uso de SqlConnection, y recomendaría una constante para la cadena de consulta para asegurarse de que siempre provenga del mismo grupo. –

3

Puede manejarlo de la misma manera. Estaba obteniendo numerosos estados de conexión == roto mientras usaba IE9. Hay algo fundamentalmente erróneo con IE9 en este aspecto, ya que ningún otro navegador tenía este problema de estados de conexión rotos después de 5 o 6 actualizaciones en las tablas de la base de datos. Entonces uso el contexto del objeto. Básicamente, simplemente ciérrelo y vuelva a abrirlo.

tengo este código antes de toda mi lecturas y actualizaciones en la capa de lógica de los businss:

if (context.Connection.State == System.Data.ConnectionState.Broken) 
{ 
    context.Connection.Close(); 
    context.Connection.Open(); 
}