2008-11-04 11 views
6

Estoy buscando una declaración SQL ficticia que funcione desde una conexión C# SQL para verificar la conectividad.declaración SQL para verificar la conectividad?

Básicamente tengo que enviar una solicitud a la base de datos, no me importa lo que devuelve. Solo quiero que sea exitosa si la base de datos aún está allí y lanzar una excepción si la base de datos no lo está.

El escenario que estoy probando es una pérdida de conectividad a la base de datos, donde la propiedad de estado SQLConnections parece estar todavía "abierta" pero no hay conectividad.

Respuesta

4

La mayoría de las bases de datos SQL tienen una "tabla" para este propósito.

En DB2, es:

select * from sysibm.sysdummy1 

mientras que Oracle tiene, de memoria,

select * from dual 

Dependerá de la base de datos en el extremo posterior.

7

Usted puede hacer esto:

Select 1 

Ok, ¿qué tal el envío de una cadena vacía o un espacio en blanco. Esos son comandos válidos para el servidor Sql.

+0

Bien para SQL Server, pero eso no funcionará para DB2 u Oracle. Vea la respuesta de Pax Diablo. – Dave

1

Debería obtener un error si no puede abrir una nueva conexión porque el db no está disponible.

Me parece que mantiene una conexión abierta todo el tiempo (lo que generalmente es una mala idea: se debe abrir una nueva conexión antes de que se ejecute un lote). ¿Es este el caso?

+0

sí a Se abre una nueva conexión cuando se inicia el lote, pero el lote puede tardar más de 15 minutos. –

+0

bien ... entonces, ¿qué? ¿aborta el lote después de unos minutos? ¿Su tiempo de espera de conexión es lo suficientemente alto? (Por defecto es 2 minutos. – StingyJack

2

La pérdida de conectividad puede ocurrir en cualquier momento.

¿Qué ocurre si las instrucciones SELECT propuestas se ejecutan correctamente, pero la conexión se rompe inmediatamente después de ejecutarlas (correctamente)?

+0

Si solo está escribiendo un chequeo de salud, puede ser útil saber que la conexión de la base de datos está activa (o más importante aún, no está activa) en un momento determinado. –

1

seleccione getdate()

1

El método más sencillo consiste en ejecutar una selección que no hace nada.

SELECT N'Test' 
0

Sería mejor para tomar su aplicación es excepción no-conectado a cada sentencia SQL se ejecuta, en lugar de utilizar una instrucción muerta para probar la conectividad. He visto sistemas en los que se gasta más del 10% del tiempo de CPU de la base de datos respondiendo a estas consultas ficticias.

0

código Ejemplo de Delphi, que confío será fácil adaptarse:

function IsConnValid(var Conn: TADOConnection; DBType: TDBType): boolean; 
var 
    qry : TADOQuery; 
begin 
    //gimme a connection, and i'll create a query, try to retrieve dummy data. 
    //if retrieval works, return TRUE. otherwise, return FALSE. 
    qry := TADOQuery.Create(nil); 
    try 
    qry.Connection := Conn; 

    case DBType of 
     //syntax for a dummy query varies by vendor. 
     dbOracle : qry.Sql.Add('SELECT 1 FROM DUAL'); 
     dbSqlServer : qry.Sql.Add('SELECT 1'); 
    end; //case 

    try 
     qry.Open; 
     //try to open the query. 
     //if we lost the connection, we'll probably get an exception. 
     Result := not(qry.Eof); //a working connection will NOT have EOF. 
     qry.Close; 
    except on e : exception do 
     //if exception when we try to open the qry, then connection went bye-bye. 
     Result := False; 
    end; //try-except 
    finally 
    qry.Free; 
    end; //try-finally 
end; 
0

Una forma de saber si todavía existe realmente la conexión a la base de datos, es tratar de realizar alguna operación en la conexión . Si la conexión ha muerto, la propiedad ConnectionState sigue siendo "Abierta", pero cuando intentes hacer algo con ella obtendrás tu excepción. Por ejemplo:

SqlConnection sqlConn; 
    private bool dbConnectionExists() { 
     try 
     { 
      sqlConn.ChangeDatabase("MyDBname"); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (dbConnectionExists()) 
     { 
      // Connection ok so do something    
     } 
    } 

Los ConnectionState cambios en las propiedades de "Cerrado" una vez que este tipo de operación se lleva a cabo y no, por lo que se puede comprobar el estado si quieres también.

Espero que ayude.

Cuestiones relacionadas