26

DB 接続をテストする次のコードがあります。DB の可用性をテストするために定期的に実行されます。

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

と:

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

私の質問は次のとおりです。これは期待どおりに機能しますか?

具体的には、のテストが気になりConnectionStateます。状態が次のようになる可能性はありますか: 接続中 (Open()同期しているため)?

その場合はどうすればいいですか?

4

7 に答える 7

54

このように試すことができます。

    public bool IsServerConnected()
    {
        using (var l_oConnection = new SqlConnection(DBConnection.ConnectionString))
        {
            try
            {
                l_oConnection.Open();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
        }
    }
于 2013-04-23T13:56:37.333 に答える
13

SqlConnectionSqlExceptionサーバーに接続できない場合にスローします。

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

        return true;
    }
}

使用法:

using(SqlConnection connection = GetConnection())
{
    if(connection.IsAvailable())
    {
        // Success
    }
}
于 2013-04-23T13:58:15.840 に答える
11

あなたのコードは問題ないように見えますが、実際には IDisposable パターンを使用する必要があり、いくつかの命名規則も使用する必要があります。

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

そしてconnection.Close()、投げるべきではありません。usingブロックを使用するだけで問題ありません。

Close状態を開いたばかりなので、状態をテストする必要はありません。
状態の詳細Broken:

Broken データ ソースへの接続が切断されています。これは、接続が開かれた後にのみ発生する可能性があります。この状態の接続は、閉じてから再度開くことができます。(この値は、製品の将来のバージョン用に予約されています。)

本当に、それをテストする必要はありません。

Connectingマルチスレッド コンテキストにあり、接続のインスタンスが共有されている場合、状態がキャッチされる可能性があります。しかし、ここではあなたの場合ではありません。

于 2013-04-23T14:03:34.100 に答える
0

実はビジュアルスタジオではコネクションクラスにsonnectionstateプロパティがあります。

接続状態が変化すると、connections statechange イベントがトリガーされます。

この記事をチェックすることをお勧めします。

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

于 2016-07-18T20:22:34.390 に答える