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 server。这将为您节省令人讨厌的异常内存使用,这是我打赌您真正追求的。

于 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

我想分享我实施的整个解决方案,以避免在每次通话时检查连接。如果连接字符串错误,则异常会停止执行,否则对于每个连接字符串,打开连接字符串的尝试只进行一次。

由于连接通常是多线程的,我添加了一个 syncobj 用于lockwhich 检查

#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 回答