Kiểm tra xem kết nối SQL đang mở hay đã đóng


102

Làm cách nào để bạn kiểm tra xem nó đang mở hay đóng mà tôi đang sử dụng

 if (SQLOperator.SQLCONNECTION.State.Equals("Open"))

tuy nhiên, ngay cả khi Trạng thái là 'Mở' nó không thành công trong lần kiểm tra này.

Câu trả lời:


175

Bạn nên sử dụng SqlConnection.State

ví dụ,

using System.Data;

if (myConnection != null && myConnection.State == ConnectionState.Closed)
{
   // do something
   // ...
}

2
1 chính xác - sử dụng SqlConnectionStateenum như một enum và không biến nó thành một chuỗi .....
marc_s

4
Đáng lẽ phải thêm using System.Data;vào câu trả lời, IMHO. Tôi đã quên không gian tên này (đã có using System.Data.SqlClient) và không thể tìm ra cách lấy ConnectionStatelàm từ khóa cho đến khi tôi thêm nó. Hy vọng điều này sẽ giúp ai đó.
vapcguy

Điều này có hoạt động nếu máy chủ (hoặc một cái gì đó giữa máy cục bộ và máy chủ) đóng kết nối không?
jpmc26

Nó sẽ không tốt hơn để nói if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }? Bằng cách này nếu kết nối vô hiệu, nó cũng "đóng".
Arvo Bowen

52

Đây là những gì tôi đang sử dụng:

if (mySQLConnection.State != ConnectionState.Open)
{
    mySQLConnection.Close();
    mySQLConnection.Open();
}

Lý do tôi không chỉ đơn giản là sử dụng:

if (mySQLConnection.State == ConnectionState.Closed)
{
    mySQLConnection.Open();
}

Là bởi vì ConnectionState cũng có thể là:

Broken, Connnecting, Executing, Fetching

Ngoài

Open, Closed

Ngoài ra, Microsoft tuyên bố rằng Đóng và sau đó Mở lại kết nối "sẽ làm mới giá trị của Trạng thái." Xem tại đây http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


Bạn nên kiểm tra xem mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connectingđể tránh việc đặt lại với kết nối chậm phải không?
caligari

@caligari Mặc dù đúng, không có đảm bảo nào tồn tại cho DbConnection, vì vậy nếu lập trình cho DbConnection trừu tượng, hãy cẩn thận.
John Zabroski

1
Cá nhân tôi nghĩ rằng đây là loại vấn đề bạn giải quyết bằng cách tránh. Tôi có thể thấy trường hợp sử dụng cho đoạn mã này trong một lớp ứng dụng trạng thái, nhưng không bao giờ thấy trên Web?
John Zabroski

John, đó chính xác là trường hợp sử dụng cho đoạn mã này. Mã chạy một ứng dụng máy chủ có thể đang cung cấp các trang, kết nối với một máy chủ REST khác. Tôi không gặp bất kỳ trường hợp nào mà tôi sẽ kết nối với cơ sở dữ liệu máy chủ trong mã phía máy khách trong ứng dụng web.
therealjumbo

Có một cảnh báo khổng lồ với điều đó: 1) với Bộ nhớ cục bộ hiện đang trở thành một điều, sớm hay muộn (rồi?) Các ứng dụng web sử dụng bộ nhớ cục bộ sẽ sử dụng cơ sở dữ liệu trong bộ nhớ đó. Nếu không phải bây giờ, họ sẽ sớm thôi. Điều khác ở đây là, mã của tôi có thể không được khái quát hóa đúng cách để sử dụng trong một ứng dụng lớn. Trọng tâm chính của tôi là lập trình nhúng, vì vậy tôi vẫn đang học ở phía máy chủ.
therealjumbo

24

Tài liệu .NET cho biết: Thuộc tính trạng thái: Sự kết hợp theo từng bit của các giá trị ConnectionState

Vì vậy, tôi nghĩ bạn nên kiểm tra

!myConnection.State.HasFlag(ConnectionState.Open)

thay vì

myConnection.State != ConnectionState.Open

bởi vì State có thể có nhiều cờ.


Tôi tự hỏi tại sao đây là enum với cờ. Vì giá trị của mục Close của enum này bằng 0 nên State.HasFlag (ConnectionState.Close) sẽ trả về true cho bất kỳ giá trị nào. Đối với tôi, điều đó có nghĩa là tôi nên chọn là "! = Close"
Ivan


4
LƯU Ý: Tôi cảm thấy cần phải đề cập rằng liên kết của Ivan đề cập rằng bạn KHÔNG NÊN sử dụng nó làm cờ. Xem câu trả lời cụ thể này: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

Kiểm tra xem kết nối MySQL có đang mở không

ConnectionState state = connection.State;
if (state == ConnectionState.Open)
{
    return true;
}
else
{
    connection.Open();
    return true;
}

Mục đích của việc quay trở lại luôn đúng là gì? Tại thời điểm này, hãy làm cho phương thức vô hiệu. Chỉ, kiểm tra xem kết nối có được mở không và nếu có thì hãy mở nó. Và ... tại sao lại viết 2 lần return true;? đặt nó ở cuối phương thức, bên ngoài dấu if/ else!
Massimiliano Kraus

Trong trường hợp có sự cố mạng, chúng sẽ đưa ra câu trả lời sai. bạn không thể chắc chắn rằng mở sẽ thực sự mở.
user613326 14/02/18

@ user613326 thực sự thì không. Không có xử lý lỗi trong mã ví dụ, vì vậy bất kỳ vấn đề nào trong khi kết nối sẽ chỉ đơn giản là ném và để bạn xử lý ngoại lệ. Do đó, giá trị trả về là chính xác.
Tom Lint

6

bạn cũng có thể sử dụng cái này

if (SQLCON.State == ConnectionState.Closed)
{
     SQLCON.Open();
}

1
using System.Data;cho bất kỳ ai không biết hoặc không biết tại sao nó không hoạt động
Coops

5

Mã này phòng thủ hơn một chút, trước khi mở kết nối, hãy kiểm tra trạng thái. Nếu trạng thái kết nối bị hỏng thì chúng ta nên cố gắng đóng nó lại. Bị hỏng có nghĩa là kết nối đã được mở trước đó và không hoạt động chính xác. Điều kiện thứ hai xác định rằng trạng thái kết nối phải được đóng trước khi cố gắng mở lại để mã có thể được gọi nhiều lần.

// Defensive database opening logic.

if (_databaseConnection.State == ConnectionState.Broken) {
    _databaseConnection.Close();
}

if (_databaseConnection.State == ConnectionState.Closed) {
    _databaseConnection.Open();
}

Chỉ cần phòng thủ hơn một chút.
GBGOLC

1
Từ hàng đợi xem xét: Tôi có thể yêu cầu bạn vui lòng thêm một số ngữ cảnh xung quanh câu trả lời của bạn. Câu trả lời chỉ có mã rất khó hiểu. Nó sẽ giúp ích cho cả người hỏi và người đọc trong tương lai nếu bạn có thể thêm thông tin vào bài đăng của mình. Xem thêm Giải thích các câu trả lời hoàn toàn dựa trên mã .
help-info.de

3

Để kiểm tra trạng thái kết nối cơ sở dữ liệu, bạn chỉ cần làm như sau

if(con.State == ConnectionState.Open){}

2

Để kiểm tra OleDbConnection State, hãy sử dụng cái này:

if (oconn.State == ConnectionState.Open)
{
    oconn.Close();
}

State trả lại ConnectionState

public override ConnectionState State { get; }

Đây là các ConnectionStateenum khác

public enum ConnectionState
    {
        //
        // Summary:
        //     The connection is closed.
        Closed = 0,
        //
        // Summary:
        //     The connection is open.
        Open = 1,
        //
        // Summary:
        //     The connection object is connecting to the data source. (This value is reserved
        //     for future versions of the product.)
        Connecting = 2,
        //
        // Summary:
        //     The connection object is executing a command. (This value is reserved for future
        //     versions of the product.)
        Executing = 4,
        //
        // Summary:
        //     The connection object is retrieving data. (This value is reserved for future
        //     versions of the product.)
        Fetching = 8,
        //
        // Summary:
        //     The connection to the data source is broken. This can occur only after the connection
        //     has been opened. A connection in this state may be closed and then re-opened.
        //     (This value is reserved for future versions of the product.)
        Broken = 16
    }

-5

Tôi sử dụng cách sau sqlconnection.state

if(conexion.state != connectionState.open())
   conexion.open();

7
connectionState.open()không tồn tại; bạn đã có nghĩa là ConnectionState.Open?
Peter Ritchie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.