8

データベースに接続できるかどうかをテストするために、次のコードを実行します。

using (SqlConnection connection = new SqlConnection(myConnectionString))
{
   try
   {
      connection.Open();
      canConnect = true;
   }
   catch (SqlException) { }
}

これは、接続が失敗した場合に例外をスローすることを除いて機能します。例外をスローしないSQL接続をテストする他の方法はありますか?

編集:精度を追加するために、接続を開いて発生する可能性のある例外をキャッチする必要なしにそれを行う簡単な方法があるかどうかを尋ねています

4

7 に答える 7

12

接続を開こうとすると、接続を開くことができない場合に例外を回避する方法はありません。関数のどこかに隠すことができますが、何があっても例外が発生します。

通常、データベースに接続できることが期待されるため、このように設計されています。失敗した接続は例外です。

そうは言っても、プロパティをチェックすることで、いつでも現在のState接続状態をテストできます。

于 2010-04-08T17:38:51.243 に答える
3

次のような拡張機能を記述します。

public static class Extension{
 public static bool CanOpen(this SqlConnection connection){
   try{
    if(connection == null){ return false; }

    connection.Open();
    var canOpen = connection.State == ConnectionState.Open;
    connection.close();
    return canOpen;
 }
 catch{
  return false;
 }
}

次に、次のように消費できます。

 using(var connection = new SqlConnection(myConnectionString)){
      if(connection.CanOpen()){
       // NOTE: The connection is not open at this point...
       // You can either open it here or not close it in the extension method...
       // I prefer opening the connection explicitly here...
     }
}

HTH。

于 2010-04-08T16:13:22.133 に答える
3

例外がスローされ、catchブロックでそれを処理する場合、接続が失敗したことはすでにわかっています。あなたはあなた自身の質問に答えたと思います。

于 2010-04-08T16:14:08.293 に答える
1

ここでの本当の答えはpingだと思います。

string data = "ismyserverpingable";
byte[] buffer = Encoding.ASCII.GetBytes (data);
int timeout = 120;
PingReply reply = pingSender.Send ("google.com", timeout, buffer, options);
if (reply.Status == IPStatus.Success)
{
}

9/10でSQL接続が可能かどうかを明示的に確認していない限り、SQLサーバーであるかどうかを知る必要があります。これにより、例外の厄介なメモリ使用量を節約できます。これは、私があなたが本当に求めているものであると私は確信しています。

于 2011-08-08T04:36:22.203 に答える
1

データベースの接続中に例外が発生するのを避けることはできませんが、これを非常にうまく処理するいくつかの機能があります。接続が存在する場合にtrueを返すこの関数を使用しています。

    public static bool IsSQLConnectionAvailable()
    {
        SqlConnection _objConn = new SqlConnection();

        try
        {
            _objConn.ConnectionString = ConfigurationManager.ConnectionStrings["DefaultSQLConnectionString"].ConnectionString;
            _objConn.Open();
        }
        catch
        {
            return false;
        }
        finally
        {
            if (_objConn.State == ConnectionState.Open)
                _objConn.Close();
        }

        return true;
    }
于 2013-06-14T10:35:36.763 に答える
0

いつでもConnectionStringBuilderクラスを使用して、接続文字列を開く前に、接続文字列に必要な各部分の存在を確認できます。

接続文字列は正しいが、接続しているデータベースサーバーがダウンしている場合でも、例外が発生します。接続しているエンドポイントがオフラインになる可能性がある場合は、文字列の品質を確認するのは無意味です。

于 2012-10-11T18:42:43.410 に答える
0

呼び出しのたびに接続をチェックしないように、実装したソリューション全体を共有したいと思います。接続文字列が間違っている場合、例外が実行を停止します。そうでない場合、接続文字列を開こうとする試みは、接続文字列ごとに1回だけ行われます。

lock接続はマルチスレッドであることが多いため、チェックで使用されるsyncobjを追加しました

#if DEBUG

private static object syncobj = new object();

private static ConcurrentDictionary<string, bool> CheckedConnection = new ConcurrentDictionary<string, bool>();

private static void CheckCanOpenConnection(SqlConnection connection)
{
    lock (syncobj)
    {
        try
        {
            CheckedConnection.TryGetValue(connection.ConnectionString, out bool found);
            if (found)
            {
                return;
            }
            else
            {
                connection.Open();
                var canOpen = connection.State == ConnectionState.Open;
                connection.Close();

                CheckedConnection.TryAdd(connection.ConnectionString, true);
                return;
            }
        }
        catch
        {
            throw new ApplicationException("Unable to connect to: " + connection.ConnectionString);
        }
    }
}

#endif

これは、接続をインスタンス化するメソッドからの呼び出しです

    private SqlConnection CreateConnection()
    {
        if (_connection == null)
        {
            _connection = new SqlConnection(this.ConnectionString);

#if DEBUG
            CheckCanOpenConnection(_connection);
#endif

        }
        return _connection;
    }
于 2020-11-27T11:39:33.690 に答える