Перевірте, чи з'єднання 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 точно - використовуйте SqlConnectionStateenum як enum, а не перетворюйте його на рядок .....
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-сервера. Я не бачу жодного випадку, коли я б підключився до бази даних сервера в коді клієнтської сторони у веб-програмі.
заколумбо

Є один гігантський застереження з цим: 1) з Local Storage тепер стає річчю, рано чи пізно (вже?) Веб-додатки, які використовують локальний сховище, будуть використовувати базу даних у цьому сховищі. Якщо не зараз, вони незабаром. Інша справа, що мій код, мабуть, недостатньо узагальнений для використання у великій програмі. Моя основна увага приділяється вбудованому програмуванню, тому я все ще навчаюся на стороні сервера.
тамaljualjumbo

24

Документація .NET говорить: Державне властивість: побітна комбінація значень ConnectionState

Тому я думаю, ви повинні перевірити

!myConnection.State.HasFlag(ConnectionState.Open)

замість

myConnection.State != ConnectionState.Open

тому що в штаті може бути кілька прапорів.


Цікаво, чому це перепина з прапорами. Оскільки значення елементу Close цього перерахунку дорівнює нулю, то State.HasFlag (ConnectionState.Close) поверне вірно для будь-якого значення. Для мене це означає, що я повинен перевірити як "! = Закрити"
Іван


4
ПРИМІТКА. Я думаю, що потрібно згадати, що посилання Івана згадує, що ви НЕ повинні використовувати це як прапори. Дивіться цю конкретну відповідь: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

Перевірте, чи підключено MySQL

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

Яка мета повернення завжди правдивої? У цей момент зробіть метод недійсним. Тільки перевірте, чи з'єднання не відкрите і чи так воно відкрите. І ... навіщо писати 2 рази return true;? покладіть його в кінці методу, поза if/ else!
Массіміліано Краус

У випадку проблем з мережею вони дадуть неправильну відповідь. Ви не можете бути впевнені, що відкриття дійсно відкриється.
користувач613326

@ user613326 насправді, це не буде. У прикладі коду немає помилок, тому будь-які проблеми під час підключення просто кинуть і залишать вас обробляти виняток. Тому повернене значення є правильним.
Том Лінт

6

Ви також можете використовувати це

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

1
using System.Data;для тих, хто не знав або не знав, чому це не працює
Купс

5

Цей код трохи захисніший, перш ніж відкривати з'єднання, перевірте стан. Якщо стан з'єднання розірвано, ми повинні спробувати його закрити. Розірване означає, що з'єднання було раніше розімкнуто і не працює належним чином. Друга умова визначає, що стан з'єднання необхідно закрити перед спробою відкрити його знову, щоб код можна було викликати повторно.

// Defensive database opening logic.

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

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

Просто бути трохи більш оборонним.
GBGOLC

1
З черги на огляд: чи можу я попросити вас додати ще трохи контексту навколо вашої відповіді. Відповіді, що стосуються лише коду, важко зрозуміти. Це допоможе запитувачу та майбутнім читачам, якщо ви зможете додати більше інформації у своєму дописі. Див. Також Пояснення відповідей на основі коду .
help-info.de

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.