2008-11-04 8 views
6

Je suis à la recherche d'une instruction SQL fictive qui fonctionnera à partir d'une connexion C# SQL pour vérifier la connectivité.Instruction SQL pour vérifier la connectivité?

Fondamentalement, j'ai besoin d'envoyer une requête à la base de données, je m'en fous de ce qu'elle retourne Je veux juste qu'elle soit réussie si la base de données est toujours là et jeter une exception si la base de données n'est pas.

Le scénario que je suis en train de tester est une perte de connectivité à la base de données, où la propriété SQLConnections State semble toujours être "Open" mais il n'y a pas de connectivité.

Répondre

4

La plupart des bases de données SQL ont une «table» dans ce but.

Dans DB2, il est:

select * from sysibm.sysdummy1 

alors que Oracle a, de la mémoire,

select * from dual 

cela dépendra de la base de données à l'extrémité arrière.

7

Vous pouvez le faire:

Select 1 

Ok, que diriez-vous d'envoyer une chaîne vide ou dans l'espace vide. Ce sont des commandes valides pour Sql Server.

+0

Fin pour SQL Server, mais cela ne fonctionnera pas pour DB2 ou Oracle. Voir la réponse de Pax Diablo. – Dave

1

Vous devriez recevoir une erreur si vous ne parvenez pas à ouvrir une nouvelle connexion car la base de données n'est pas disponible.

Il me semble que vous maintenez une connexion ouverte tout le temps (ce qui est généralement une mauvaise idée - une nouvelle connexion doit être ouverte avant l'exécution d'un lot). Est-ce le cas?

+0

oui a une nouvelle connexion est ouverte lorsque le lot démarre mais le lot peut prendre jusqu'à 15 minutes. –

+0

ok ... alors quoi? le lot avorte-t-il après quelques minutes? Le délai d'expiration de votre connexion est-il suffisamment élevé? (par défaut, 2 minutes – StingyJack

2

Une perte de connectivité peut se produire à tout moment. Que se passe-t-il si les instructions SELECT proposées s'exécutent correctement, mais que la connexion se bloque immédiatement après leur exécution (avec succès)?

+0

Si vous écrivez simplement un bilan de santé, il peut être utile de savoir que la connexion à la base de données est active (ou, plus important encore, non active) à un moment donné. –

1

select getdate()

1

La méthode la plus simple consiste à exécuter une sélection qui ne fait rien.

SELECT N'Test' 
0

Il serait préférable de prendre votre mise en œuvre est exception non connecté pour chaque instruction SQL que vous exécutez, plutôt que d'utiliser une déclaration factice pour tester la connectivité. J'ai vu des systèmes où plus de 10% du temps CPU de la base de données est passé à répondre à ces requêtes fictives.

0

Exemple code Delphi, que je fais confiance sera facile à adapter:

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

Une façon de savoir si la connexion à la base de données n'existe toujours en fait, est d'essayer d'effectuer une opération sur la connexion . Si la connexion est déconnectée, la propriété ConnectionState reste toujours "ouverte", mais lorsque vous essayez de faire quelque chose avec elle, vous obtenez votre exception. Par exemple:

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    
     } 
    } 

Les changements de propriété ConnectionState à « Fermé » une fois que ce type d'opération est réalisée et échoue, donc vous pouvez alors vérifier l'état si vous voulez aswell.

Espérons que ça aide.