it-swarm.dev

Comment vérifier la disponibilité de la base de données

J'ai le code suivant pour tester la connexion à la base de données. Il est exécuté périodiquement pour tester la disponibilité de la base de données:

private bool CheckDbConn()
{
   SqlConnection conn = null;
   bool result = true;

   try
   {
       conn = DBConnection.getNewCon();
       ConnectionState conState = conn.State;

       if (conState == ConnectionState.Closed || conState == ConnectionState.Broken)
       {
          logger.Warn(LogTopicEnum.Agent, "Connection failed in DB connection test on CheckDBConnection");
          return false;
       }             
   }
   catch (Exception ex)
   {
      logger.Warn(LogTopicEnum.Agent, "Error in DB connection test on CheckDBConnection", ex);
      return false; // any error is considered as db connection error for now
   }
   finally
   {
      try
      {
         if (conn != null)
         {
            conn.Close();
         }
      }
      catch (Exception ex)
      {
         logger.Warn(LogTopicEnum.Agent, "Error closing connection on CheckDBConnection", ex);
         result = false;
      }
   }
   return result;
}

Et:

static public SqlConnection getNewCon()
{
    SqlConnection newCon = new SqlConnection();
    newCon.ConnectionString = DBConnection.ConnectionString; // m_con.ConnectionString;
    newCon.Open();
    return newCon;
}

Ma question est la suivante: cela fonctionnera-t-il comme prévu?

Plus précisément, je suis préoccupé par le test de ConnectionState. Est-il possible que l'état soit: en connexion (puisque Open() est synchrone)? 

Que dois-je faire dans ce cas?

Merci d'avance, Omer

20
omer schleifer

Vous pouvez essayer comme ça.

    public bool IsServerConnected()
    {
        using (var l_oConnection = new SqlConnection(DBConnection.ConnectionString))
        {
            try
            {
                l_oConnection.Open();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
        }
    }
42
Ramesh Durai

SqlConnection lancera une SqlException quand il ne peut pas se connecter au serveur.

public static class SqlExtensions
{
    public static bool IsAvailable(this SqlConnection connection)
    {
        try
        {
            connection.Open();
            connection.Close();
        }
        catch(SqlException)
        {
            return false;
        }

        return true;
    }
}

Usage:

using(SqlConnection connection = GetConnection())
{
    if(connection.IsAvailable())
    {
        // Success
    }
}
10
Romoku

Votre code semble correct, mais vous devez vraiment utiliser le modèle IDisposable, ainsi que certaines conventions de dénomination:

private bool CheckDbConnection(string connectionString)
{
    try
    {
        using(var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            return true;
        }
    }
    catch (Exception ex)
    {
        logger.Warn(LogTopicEnum.Agent, "Error in DB connection test on CheckDBConnection", ex);
        return false; // any error is considered as db connection error for now
    }
}

Et connection.Close() n'est pas censé lancer. Utilisez simplement le bloc using et tout ira bien.

Inutile de tester l'état Close puisque vous venez de l'ouvrir.
Plus d'informations sur l'état Broken:

Cassé La connexion à la source de données est interrompue. Cela peut se produire seulement après que la connexion a été ouverte. Une connexion dans cet état peut être fermé puis rouvert. (Cette valeur est réservée aux futures versions Du produit.)

Donc vraiment, pas besoin de tester ça.

L'état Connecting peut être intercepté si vous vous trouvez dans un contexte multithread et que votre instance de connexion est partagée. Mais ce n'est pas votre cas ici.

9
Cyril Gandon

en fait, dans Visual Studio, la classe de connexion a la propriété sonnectionstate.

lorsque l'état de la connexion change, l'événement de connexion statechange est déclenché.

vous voudrez peut-être consulter cet article.

https://msdn.Microsoft.com/en-us/library/aa326268(v=vs.71).aspx

0
nadir

J'utilisais la solution de @Ramesh Durai, mais au moins dans ma configuration (l'appel/le test de l'application après le démarrage de l'application; utilisation de .Net 3.5 avec la base de données Sql Server 2012), le premier appel de IsConnected() après la mise hors ligne de la base de données retournant true. Cependant, l’exception attendue était lancée sur la ligne ExecuteScalar() ci-dessous:

public bool IsConnected() {
    using (var conn = new SqlConnection(DBConnection.ConnectionString)) {
        using (var cmd = New SqlCommand("SELECT 1", conn)) {
            try {
                conn.Open();
                cmd.ExecuteScalar();
                return true;
            } catch (SqlException) {
                return false;
            }
        }
    }
}
0
monty

Ce code est pour Mysql.

public class Program
{
string connection = "SERVER=localhost; user id=root; password=; database=dbname";
private void Form1_Load(object sender, System.EventArgs e)
{
checkifconnected();
}

private void checkifconnected()
{
MySqlConnection connect = new MySqlConnection(connection);
try{
connect.Open();
MessageBox.Show("Database connected");
}
catch
{
MessageBox.Show("you are not connected to database");
}
}

public static void Main()
{

}
}
0
Miguel

Je ne peux pas commenter alors ...

... évitez également de capturer les exceptions générales "catch (Exception ex)" et essayez de capturer des exceptions spécifiques, comme dans les exemples ci-dessus "catch (SqlException ex)"

0
shadow