Проверьте, открыто или закрыто соединение SQL


102

Как проверить, открыт он или закрыт? Я использовал

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

однако, даже если состояние «открыто», оно не проходит эту проверку.

Ответы:


175

Вы должны использовать SqlConnection.State

например,

using System.Data;

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

2
+1 точно - используйте SqlConnectionStateперечисление как перечисление, а не превращайте его в строку .....
marc_s

4
Надо было добавить using System.Data;в ответ, ИМХО. Я забыл это пространство имен (было using System.Data.SqlClient) и не мог понять, как получить ConnectionStateв качестве ключевого слова, пока не добавил его. Надеюсь, это кому-то поможет.
vapcguy

Работает ли это, если сервер (или что-то между локальным компьютером и сервером) закрыл соединение?
jpmc26

Не лучше ли сказать if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }? Таким образом, если соединение нулевое, оно также «закрыто».
Арво Боуэн,

52

Вот что я использую:

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

Причина, по которой я не просто использую:

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

Потому что ConnectionState также может быть:

Broken, Connnecting, Executing, Fetching

В дополнении к

Open, Closed

Кроме того, Microsoft заявляет, что закрытие, а затем повторное открытие соединения «обновит значение состояния». См. Здесь http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


Вы должны проверить, mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connectingчтобы избежать сброса при медленном соединении, не так ли?
Caligari

@caligari Хотя это правда, для DbConnection нет гарантии, поэтому при программировании на абстрактный DbConnection будьте осторожны.
Джон Заброски

1
Я лично думаю, что это проблема, которую вы решаете, избегая. Возможно, я смогу увидеть вариант использования этого фрагмента кода на уровне приложения с отслеживанием состояния, но не в Интернете?
Джон Заброски

Джон, это именно тот вариант использования этого кода. Код, запускающий серверное приложение, которое может обслуживать страницы, подключаясь к другому серверу REST, что угодно. Я не вижу случая, чтобы я подключился к базе данных сервера в коде на стороне клиента в веб-приложении.
therealjumbo

В связи с этим есть одно огромное предостережение: 1) с учетом того, что локальное хранилище становится все более популярным, рано или поздно (уже?) Веб-приложения, использующие локальное хранилище, будут использовать базу данных в этом хранилище. Если не сейчас, то скоро. Другое дело, что мой код, вероятно, не обобщен должным образом для использования в большом приложении. Моя основная цель - встроенное программирование, поэтому я все еще учусь на стороне сервера.
therealjumbo

24

В документации .NET говорится: State Property: побитовая комбинация значений ConnectionState.

Я думаю, тебе стоит проверить

!myConnection.State.HasFlag(ConnectionState.Open)

вместо того

myConnection.State != ConnectionState.Open

потому что состояние может иметь несколько флагов.


Интересно, почему это перечисление с флагами. Поскольку значение элемента Close этого перечисления равно нулю, State.HasFlag (ConnectionState.Close) вернет true для любого значения. Для меня это означает, что я должен проверить как "! = Close"
Иван


4
ПРИМЕЧАНИЕ: Я считаю необходимым упомянуть, что ссылка Ивана упоминает, что вы НЕ ДОЛЖНЫ использовать это как флаги. См. Этот конкретный ответ: stackoverflow.com/a/35484965/2499090
Брент Риттенхаус,

9

Проверьте, открыто ли соединение MySQL

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

Какая цель всегда возвращать истину? На этом этапе сделайте метод недействительным. Только проверьте, не открыто ли соединение, и если да, то откройте его. И ... зачем писать 2 раза return true;? поместите его в конец метода, вне if/ else!
Массимилиано Краус

В случае проблем с сетью они дадут неправильный ответ. вы не можете быть уверены, что open действительно откроется.
user613326

@ user613326 вообще-то нет. В примере кода нет обработки ошибок, поэтому любые проблемы при подключении просто вызовут и предоставят вам возможность обработать исключение. Таким образом, возвращенное значение верное.
Том Линт,

6

вы также можете использовать это

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

1
using System.Data;для тех, кто не знал или не знал, почему это не работает
Coops

5

Этот код является немного более защитным, прежде чем открывать соединение, проверьте состояние. Если состояние соединения разорвано, мы должны попытаться закрыть его. Разорванный означает, что соединение ранее было открыто и работает некорректно. Второе условие определяет, что состояние соединения должно быть закрыто перед повторной попыткой его открытия, чтобы код можно было вызывать повторно.

// Defensive database opening logic.

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

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

Просто быть немного более оборонительным.
GBGOLC

1
Из очереди на рассмотрение: Могу я попросить вас добавить дополнительный контекст к вашему ответу. Ответы только на коде трудно понять. Если вы добавите дополнительную информацию в свой пост, это поможет как спрашивающему, так и будущим читателям. См. Также « Объяснение полностью основанных на коде ответов» .
help-info.de 08

3

Чтобы проверить состояние подключения к базе данных, вы можете просто сделать следующее

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

2

Чтобы проверить состояние OleDbConnection, используйте это:

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

State вернуть ConnectionState

public override ConnectionState State { get; }

Вот другое ConnectionStateперечисление

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

Я использую следующий способ sqlconnection.state

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

7
connectionState.open()не существует; ты имел ввиду ConnectionState.Open?
Питер Ричи
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.