it-swarm.com.de

So prüfen Sie die Verfügbarkeit der Datenbank

Ich habe den folgenden Code zum Testen der DB-Verbindung. Er wird regelmäßig ausgeführt, um die Verfügbarkeit der DB zu testen:

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

Und:

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

Meine Frage ist: Wird das wie erwartet funktionieren?

Konkret geht es mir um den Test der ConnectionState. Ist es möglich, dass der Status: Verbinden (da Open() synchron ist) ist? 

Was soll ich in diesem Fall tun?

Vielen Dank im Voraus, Omer

20
omer schleifer

Sie können es so versuchen.

    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 wirft eine SqlException, wenn keine Verbindung zum Server hergestellt werden kann.

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

        return true;
    }
}

Verwendungszweck:

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

Ihr Code scheint gut zu sein, aber Sie müssen wirklich das IDisposable-Muster und einige Namenskonventionen verwenden:

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

Und connection.Close() soll nicht werfen. Verwenden Sie einfach den using-Block und es geht Ihnen gut.

Sie müssen den Close-Status nicht testen, da Sie ihn gerade geöffnet haben.
Mehr zum Broken-Zustand:

Unterbrochen Die Verbindung zur Datenquelle ist unterbrochen. Dies kann vorkommen erst nachdem die Verbindung geöffnet wurde. Eine Verbindung in diesem Zustand kann geschlossen und dann wieder geöffnet werden. (Dieser Wert ist für zukünftige Versionen des Produkts reserviert.)

Also wirklich, keine Notwendigkeit, das zu testen.

Der Connecting-Status könnte catch sein, wenn Sie sich in einem Multithread-Kontext befinden und Ihre Verbindungsinstanz gemeinsam genutzt wird. Dies ist jedoch nicht Ihr Fall.

9
Cyril Gandon

im Visual Studio verfügt die Verbindungsklasse tatsächlich über eine Eigenschaft "sonnectionstate".

wenn sich der Verbindungsstatus ändert, wurde das Connections Statechange-Ereignis ausgelöst.

vielleicht möchten Sie diesen Artikel überprüfen.

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

0
nadir

Ich habe die Lösung von @Ramesh Durai verwendet, stellte jedoch fest, dass in meinem Setup mindestens (die App ruft/testet regelmäßig, nachdem die App gestartet wurde; mit .Net 3.5 mit SQL Server 2012-Datenbank) der erste Aufruf von IsConnected(), nachdem die Datenbank offline geschaltet wurde Rückgabe von true. Die erwartete Ausnahme wurde jedoch in die ExecuteScalar()-Zeile darunter geworfen:

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

Dieser Code ist für 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

Das kann ich nicht kommentieren ...

Vermeiden Sie auch allgemeine Ausnahmen "catch (Exception ex)" und versuchen Sie, bestimmte Ausnahmen wie die obigen Beispiele "catch (SqlException ex)" zu erfassen

0
shadow