簡體   English   中英

測試sql連接不拋出異常

[英]Test sql connection without throwing exception

為了測試我是否可以連接到我的數據庫,我執行以下代碼:

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

這有效,除非它在連接失敗時拋出異常。 有沒有其他方法可以測試不引發異常的 Sql 連接?

編輯:為了增加精度,我問是否有一種簡單的方法可以做到這一點而無需打開連接並捕獲可能發生的異常

嘗試打開連接時,如果無法打開連接,則無法避免異常。 它可以隱藏在某個函數中,但無論如何你都會得到異常。

它是這樣設計的,因為通常您希望能夠連接到數據庫。 失敗的連接是個例外

也就是說,您可以隨時通過檢查State屬性來測試當前連接狀態。

像這樣寫一個擴展:

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

哈。

如果它拋出一個異常並且你在你的 catch 塊中處理它,你就已經知道連接失敗了。 我想你回答了你自己的問題。

您無法避免連接數據庫時出現異常,但有一些功能可以很好地處理這個問題。 我正在使用這個函數,如果連接存在則返回 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;
    }

我認為這里真正的答案是 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。 這將為您節省異常的討厭的內存使用,這正是我打賭您真正想要的。

您始終可以使用ConnectionStringBuilder類並在嘗試打開連接字符串之前檢查連接字符串所需的每個部分是否存在。

如果連接字符串是正確的,但是您要連接的數據庫服務器已關閉,您仍然會得到一個例外。 如果您正在連接的端點可能處於離線狀態,那么檢查字符串的質量是毫無意義的。

我想分享我為避免在每次通話時檢查連接而實施的整個解決方案。 如果連接字符串錯誤,異常會停止執行,否則對於每個連接字符串只嘗試打開一次連接字符串。

由於連接通常是多線程的,我添加了一個由lock使用的同步對象,用於檢查

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM