2010-04-08 10 views
8

Para probar si puedo conectar a mi base de datos, que ejecute el siguiente código:Prueba de conexión de SQL sin lanzar una excepción

using (SqlConnection connection = new SqlConnection(myConnectionString)) 
{ 
    try 
    { 
     connection.Open(); 
     canConnect = true; 
    } 
    catch (SqlException) { } 
} 

Esto funciona excepto que lanza una excepción si la conexión ha fallado. ¿Hay alguna otra manera de probar una conexión Sql que no arroje una excepción?

Editar: Para añadir precisión, lo que te pido si hay un método sencillo que hace eso sin tener que abrir la conexión y capturar las excepciones que pueden ocurrir

+0

¿Por qué quiere evitar la excepción? – CResults

Respuesta

12

Al intentar abrir una conexión, no hay forma de evitar la excepción si la conexión no se puede abrir. Se puede ocultar en una función en alguna parte, pero obtendrás la excepción, pase lo que pase.

Fue diseñado de esta manera porque generalmente espera poder conectarse a la base de datos. Una conexión fallida es la excepción .

Dicho esto, se puede comprobar el estado de conexión actual en cualquier momento mediante la comprobación de la propiedad State.

2

escribir una extensión de esta manera:

public static class Extension{ 
public static bool CanOpen(this SqlConnection connection){ 
    try{ 
    if(connection == null){ return false; } 

    connection.Open(); 
    var canOpen = connection.State == ConnectionState.Open; 
    connection.close(); 
    return canOpen; 
} 
catch{ 
    return false; 
} 
} 

A continuación, puede consumirlo como:

using(var connection = new SqlConnection(myConnectionString)){ 
     if(connection.CanOpen()){ 
     // NOTE: The connection is not open at this point... 
     // You can either open it here or not close it in the extension method... 
     // I prefer opening the connection explicitly here... 
    } 
} 

HTH.

+0

Buena respuesta, pero tío, estás lanzando una excepción – CResults

+0

@CResults: no hay TIRO en el bloque catch del método de extensión que efectivamente come esa excepción. Prefiero tener esta excepción lanzada, pero el OP mencionó que no quería un lanzamiento de excepción cuando comprobaba si se podía abrir una conexión, de ahí mi solución. – Sunny

+0

Tenga cuidado con esta solución, _SqlConnection.Open() _ obtendrá la conexión del pool si pooling está disponible. Luego, _State_ será _Open_ incluso si la conexión está dañada (canal TCP inactivo, por ejemplo). Y luego la excepción solo se levantará al ejecutar un comando. Una solución alternativa es usar _Connection.ChangeDatabase (Connection.Database); _ para verificar si la conexión está disponible. – JoeBilly

3

Si arroja una excepción y la maneja en su bloque catch, ya sabe que la conexión falló. Creo que respondiste tu propia pregunta.

0

Creo que la verdadera respuesta aquí es ping.

string data = "ismyserverpingable"; 
byte[] buffer = Encoding.ASCII.GetBytes (data); 
int timeout = 120; 
PingReply reply = pingSender.Send ("google.com", timeout, buffer, options); 
if (reply.Status == IPStatus.Success) 
{ 
} 

A menos que usted está mirando para ver si explícitamente una conexión de SQL es posible 9/10 debe saber si algo es un servidor SQL. Esto te ahorraría ese desagradable uso de memoria de una excepción que es lo que estoy seguro de que realmente buscas.

+0

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx – Arian

0

Siempre puede usar la clase ConnectionStringBuilder y verificar la existencia de cada pieza que requiere una cadena de conexión antes de intentar abrirla.

Si la cadena de conexión es correcta, pero el servidor de la base de datos que está conectando está desactivado, todavía obtendrá una excepción. Es inútil comprobar la calidad de la cadena si el punto final con el que se está conectando puede estar desconectado.

0

No puede evitar que se produzcan excepciones al conectar la base de datos, pero tiene alguna función que maneja esto muy bien. Estoy usando esta función que devuelve verdadero si existe conexión.

public static bool IsSQLConnectionAvailable() 
    { 
     SqlConnection _objConn = new SqlConnection(); 

     try 
     { 
      _objConn.ConnectionString = ConfigurationManager.ConnectionStrings["DefaultSQLConnectionString"].ConnectionString; 
      _objConn.Open(); 
     } 
     catch 
     { 
      return false; 
     } 
     finally 
     { 
      if (_objConn.State == ConnectionState.Open) 
       _objConn.Close(); 
     } 

     return true; 
    } 
Cuestiones relacionadas