Перевірте, чи з'єднання 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.