Sprawdź, czy połączenie SQL jest otwarte czy zamknięte


102

Jak sprawdzić, czy jest otwarty czy zamknięty, którego używałem

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

jednak nawet stan „otwarty” nie powiedzie się w tej kontroli.

Odpowiedzi:


175

Powinieneś używać SqlConnection.State

na przykład,

using System.Data;

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

2
+1 dokładnie - użyj SqlConnectionStatewyliczenia jako wyliczenia i nie zamieniaj go w ciąg .....
marc_s

4
Powinienem był dodać using System.Data;w odpowiedzi, IMHO. Zapomniałem tej przestrzeni nazw (miałem using System.Data.SqlClient) i nie mogłem wymyślić, jak uzyskać ConnectionStatejako słowo kluczowe, dopóki go nie dodałem. Mam nadzieję, że to komuś pomoże.
vapcguy

Czy to działa, jeśli serwer (lub coś między maszyną lokalną a serwerem) zamknął połączenie?
jpmc26

Czy nie byłoby lepiej powiedzieć if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }? W ten sposób, jeśli połączenie jest zerowe, jest również „zamknięte”.
Arvo Bowen

52

Oto czego używam:

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

Powód, dla którego nie używam po prostu:

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

Dzieje się tak, ponieważ ConnectionState może być również:

Broken, Connnecting, Executing, Fetching

Oprócz

Open, Closed

Ponadto firma Microsoft stwierdza, że ​​zamknięcie, a następnie ponowne otwarcie połączenia „odświeży wartość stanu”. Zobacz tutaj http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


Powinieneś przetestować, czy mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connectinguniknąć resetowania przy wolnych połączeniach, prawda?
caligari

@caligari Chociaż prawda, nie ma gwarancji dla DbConnection, więc jeśli programujesz do abstrakcyjnej DbConnection, zachowaj ostrożność.
John Zabroski

1
Osobiście uważam, że jest to problem, który rozwiązuje się, unikając. Być może widzę przypadek użycia tego fragmentu kodu w stanowej warstwie aplikacji, ale nigdy w Internecie?
John Zabroski

John, dokładnie tak jest w przypadku tego kodu. Kod uruchamiający aplikację serwera, która może obsługiwać strony, łącząc się z innym serwerem REST. Nie widzę żadnego przypadku, w którym chciałbym połączyć się z bazą danych serwera w kodzie po stronie klienta w aplikacji internetowej.
therealjumbo

Jest jedno gigantyczne zastrzeżenie: 1) ponieważ Local Storage staje się teraz rzeczą, prędzej czy później (już?) Aplikacje internetowe, które używają lokalnej pamięci, będą używać bazy danych w tym magazynie. Jeśli nie teraz, wkrótce. Inną rzeczą jest to, że mój kod prawdopodobnie nie jest odpowiednio uogólniony do użycia w dużej aplikacji. Moim głównym celem jest programowanie wbudowane, więc nadal uczę się po stronie serwera.
therealjumbo

24

Dokumentacja .NET mówi: Właściwość stanu: bitowa kombinacja wartości ConnectionState

Więc myślę, że powinieneś sprawdzić

!myConnection.State.HasFlag(ConnectionState.Open)

zamiast

myConnection.State != ConnectionState.Open

ponieważ stan może mieć wiele flag.


Zastanawiam się, dlaczego to jest wyliczenie z flagami. Ponieważ wartość elementu Close tego wyliczenia wynosi zero, wówczas State.HasFlag (ConnectionState.Close) zwróci wartość true dla dowolnej wartości. Dla mnie oznacza to, że powinienem zaznaczyć jako „! = Zamknij”
Ivan


4
UWAGA: Uważam, że należy wspomnieć, że łącze Ivana wspomina, że ​​NIE POWINIENEŚ używać tego jako flagi. Zobacz tę konkretną odpowiedź: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

Sprawdź, czy połączenie MySQL jest otwarte

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

Jaki jest cel powrotu zawsze prawda? W tym momencie unieważnij metodę. Tylko sprawdź, czy połączenie nie jest otwarte, a jeśli tak, otwórz je. I ... po co pisać 2 razy return true;? umieść go na końcu metody, poza if/ else!
Massimiliano Kraus

W przypadku problemów z siecią dałyby one błędną odpowiedź. nie możesz być pewien, że open rzeczywiście się otworzy.
user613326

@ user613326 właściwie nie byłoby. W przykładowym kodzie nie ma obsługi błędów, więc wszelkie problemy podczas łączenia po prostu wyrzucą i pozostawią cię do obsłużenia wyjątku. Dlatego zwracana wartość jest poprawna.
Tom Lint

6

możesz również tego użyć

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

1
using System.Data;dla każdego, kto nie wiedział lub nie wiedział, dlaczego to nie działa
Coops

5

Ten kod jest trochę bardziej defensywny, przed otwarciem połączenia sprawdź stan. Jeśli stan połączenia jest uszkodzony, powinniśmy spróbować go zamknąć. Zepsuty oznacza, że ​​połączenie zostało wcześniej otwarte i nie działa poprawnie. Drugi warunek określa, że ​​stan połączenia musi zostać zamknięty przed próbą ponownego otwarcia, aby kod mógł być wywoływany wielokrotnie.

// Defensive database opening logic.

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

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

Po prostu trochę bardziej defensywny.
GBGOLC

1
Z kolejki recenzji: Czy mogę prosić o dodanie więcej kontekstu do Twojej odpowiedzi. Odpowiedzi zawierające tylko kod są trudne do zrozumienia. Pomoże to pytającemu i przyszłym czytelnikom, jeśli możesz dodać więcej informacji w swoim poście. Zobacz także Wyjaśnianie odpowiedzi opartych wyłącznie na kodzie .
help-info.de

3

Aby sprawdzić stan połączenia z bazą danych, możesz po prostu wykonać następujące czynności

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

2

Aby sprawdzić stan OleDbConnection, użyj tego:

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

State Zwróć ConnectionState

public override ConnectionState State { get; }

Oto inne ConnectionStatewyliczenie

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

Używam następującego sposobu sqlconnection.state

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

7
connectionState.open()nie istnieje; pan miał na myśli ConnectionState.Open?
Peter Ritchie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.