2013-04-23 20 views
16

Tôi có đoạn code sau đây để kiểm tra kết nối DB, nó chạy theo định kỳ để kiểm tra DB sẵn:Làm thế nào để kiểm tra tính sẵn sàng cơ sở dữ liệu

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

Và:

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

Câu hỏi của tôi là: sẽ này làm việc như mong đợi?

Cụ thể, tôi quan tâm đến việc kiểm tra số ConnectionState. Có thể nhà nước sẽ: kết nối (kể từ Open() là đồng bộ)?

Tôi nên làm gì trong trường hợp đó?

Xin cảm ơn trước, Omer

Trả lời

32

Bạn có thể thử như thế này.

public bool IsServerConnected() 
    { 
     using (var l_oConnection = new SqlConnection(DBConnection.ConnectionString)) 
     { 
      try 
      { 
       l_oConnection.Open(); 
       return true; 
      } 
      catch (SqlException) 
      { 
       return false; 
      } 
     } 
    } 
+0

nếu l_oConnection.Close(); sẽ ném một ngoại lệ trong khối cuối cùng? –

+1

sử dụng ... đóng và ngắt kết nối, không cần phải đóng rồi – Steve

+0

Tôi đã sử dụng tính năng này nhưng thấy nó trả về true trong lần gọi đầu tiên sau khi cơ sở dữ liệu được đưa vào ngoại tuyến. Điều này đã được sử dụng. Net 3.5 chống lại một máy chủ sql 2012 db. – monty

9

SqlConnection sẽ ném SqlException khi không thể kết nối với máy chủ.

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

     return true; 
    } 
} 

Cách sử dụng:

using(SqlConnection connection = GetConnection()) 
{ 
    if(connection.IsAvailable()) 
    { 
     // Success 
    } 
} 
8

Mã của bạn có vẻ tốt đẹp, nhưng bạn thực sự cần phải sử dụng mô hình IDisposable, và một số quy ước đặt tên quá:

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() là không được phép ném đi. Chỉ cần sử dụng khối using và bạn vẫn ổn.

Không cần kiểm tra trạng thái Close, vì bạn vừa mở nó.
More about the Broken state:

Bị hỏng Kết nối với nguồn dữ liệu bị hỏng. Điều này có thể xảy ra chỉ sau khi kết nối đã được mở. Kết nối trong trạng thái này có thể bị đóng và sau đó mở lại. (Giá trị này được dành riêng cho các phiên bản tương lai của sản phẩm.)

Vì vậy, thực sự, không cần phải kiểm tra điều đó.

Trạng thái Connecting có thể bị bắt nếu bạn đang ở trong ngữ cảnh đa luồng và phiên bản kết nối của bạn được chia sẻ. Nhưng nó không phải là trường hợp của bạn ở đây.

0

Tôi không thể bình luận như vậy ...

... cũng tránh đánh bắt ngoại lệ chung "catch (Exception ex)" và cố gắng nắm bắt ngoại lệ cụ thể như các ví dụ trên "catch (SqlException ex)"

0

thực sự, trong studio trực quan, lớp kết nối có thuộc tính sonnectionstate.

khi thay đổi trạng thái kết nối, kết nối sự kiện statechange bị trigerred.

bạn có thể muốn kiểm tra bài viết này.

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

+0

Bạn không chắc chắn cách nó liên quan đến studio trực quan, cộng với nếu bạn nhìn vào bài đăng, nó có connectionState trong đó ... –

0

Tôi đã sử dụng giải pháp @Ramesh Durai nhưng phát hiện ra rằng vào thiết lập của tôi ít nhất (sự kêu gọi ứng dụng/kiểm tra định kỳ sau khi ứng dụng đã bắt đầu, sử dụng Net 3.5 với SQL Server 2012 cơ sở dữ liệu) mà là người đầu tiên hãy gọi tới IsConnected() sau khi lấy cơ sở dữ liệu ngoại tuyến đã trở về true. Tuy nhiên, nó đã ném ngoại lệ dự kiến ​​trên đường dây ExecuteScalar() bên dưới:

public bool IsConnected() { 
    using (var conn = new SqlConnection(DBConnection.ConnectionString)) { 
     using (var cmd = New SqlCommand("SELECT 1", conn)) { 
      try { 
       conn.Open(); 
       cmd.ExecuteScalar(); 
       return true; 
      } catch (SqlException) { 
       return false; 
      } 
     } 
    } 
} 
Các vấn đề liên quan