测试sql连接而不抛出异常

时间:2010-04-08 16:06:51

标签: c# exception sqlconnection

为了测试我是否可以连接到我的数据库,我执行以下代码:

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

除非在连接失败时抛出异常,否则此方法有效。有没有其他方法来测试不抛出异常的Sql连接?

编辑: 为了增加精度,我问是否有一个简单的方法可以做到这一点而无需打开连接并捕获可能发生的异常

7 个答案:

答案 0 :(得分:12)

尝试打开连接时,如果无法打开连接,则无法避免异常。它可以隐藏在某个地方的某个函数中,但不管是什么,你都会得到异常。

它的设计是这样的,因为通常您希望能够连接到数据库。连接失败是异常

话虽如此,您可以通过查看State属性随时测试当前连接状态。

答案 1 :(得分: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。

答案 2 :(得分:3)

如果它抛出异常而你在catch块中处理它,你就已经知道连接失败了。我想你回答了自己的问题。

答案 3 :(得分:0)

我认为这里真正的答案是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)
{
}

除非您明确检查是否可以进行SQL连接9/10,否则您应该知道某些内容是否是sql server。这样可以节省您对异常的令人讨厌的内存使用情况,这正是我打赌你真正想要的。

答案 4 :(得分:0)

您可以始终使用ConnectionStringBuilder类,并在尝试打开连接字符串之前检查连接字符串所需的每个部分是否存在。

如果连接字符串正确,但您连接的数据库服务器已关闭,那么您仍然会获得一个除外。如果您要连接的端点可能处于脱机状态,那么检查字符串质量的方法毫无意义。

答案 5 :(得分:0)

连接数据库时无法避免异常,但有一些功能可以很好地处理这个问题。我正在使用此函数,如果存在连接,则返回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;
    }

答案 6 :(得分:0)

我想分享我已实现的整个解决方案,以避免在每次通话时检查连接。如果连接字符串错误,则异常将停止执行,否则尝试为每个连接字符串执行一次打开连接字符串的操作。

由于该连接通常是多线程的,所以我添加了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;
    }