Periksa apakah Koneksi SQL Terbuka atau Tertutup


102

Bagaimana Anda memeriksa apakah itu terbuka atau tertutup yang saya gunakan

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

Namun, bahkan Negara bagian 'Terbuka' gagal pada pemeriksaan ini.

Jawaban:


175

Anda harus menggunakan SqlConnection.State

misalnya,

using System.Data;

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

2
+1 persis - gunakan SqlConnectionStateenum sebagai enum dan bukan mengubahnya menjadi string .....
marc_s

4
Seharusnya ditambahkan using System.Data;jawabannya, IMHO. Saya lupa namespace ini (had using System.Data.SqlClient) dan tidak tahu cara mendapatkannya ConnectionStatesebagai kata kunci sampai saya menambahkannya. Semoga ini bisa membantu seseorang.
vapcguy

Apakah ini berfungsi jika server (atau sesuatu antara mesin lokal dan server) menutup koneksi?
jpmc26

Bukankah lebih baik mengatakannya if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }? Dengan cara ini jika koneksi adalah null, itu juga "ditutup".
Arvo Bowen

52

Inilah yang saya gunakan:

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

Alasan saya tidak hanya menggunakan:

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

Apakah karena ConnectionState juga bisa:

Broken, Connnecting, Executing, Fetching

Sebagai tambahannya

Open, Closed

Selain itu Microsoft menyatakan bahwa Menutup, dan kemudian membuka kembali koneksi "akan menyegarkan nilai Status." Lihat di sini http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


Anda harus menguji apakah mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connectinguntuk menghindari penyetelan ulang dengan koneksi yang lambat, bukan?
caligari

@caligari Meskipun benar, tidak ada jaminan untuk DbConnection, jadi jika memprogram ke DbConnection abstrak, berhati-hatilah.
John Zabroski

1
Saya pribadi berpikir ini adalah jenis masalah yang Anda selesaikan dengan menghindari. Saya mungkin dapat melihat kasus penggunaan untuk potongan kode ini di lapisan aplikasi berstatus, tetapi tidak pernah di Web?
John Zabroski

John, itulah kasus penggunaan untuk kode ini. Kode menjalankan aplikasi server yang dapat melayani halaman, terhubung ke server REST lain apa pun. Saya tidak melihat kasus apa pun di mana saya akan terhubung ke database server dalam kode sisi klien dalam aplikasi web.
therealjumbo

Ada satu peringatan besar dengan itu: 1) dengan Penyimpanan Lokal sekarang menjadi sesuatu, cepat atau lambat (sudah?) Aplikasi web yang menggunakan penyimpanan lokal akan menggunakan database dalam penyimpanan itu. Jika tidak sekarang, mereka akan segera melakukannya. Hal lain di sini adalah, kode saya mungkin tidak digeneralisasi dengan benar untuk digunakan dalam aplikasi besar. Fokus utama saya adalah pemrograman tertanam, jadi saya masih belajar di sisi server.
therealjumbo

24

Dokumentasi NET mengatakan: Properti Negara: Kombinasi bitwise dari nilai-nilai ConnectionState

Jadi saya pikir Anda harus memeriksanya

!myConnection.State.HasFlag(ConnectionState.Open)

dari pada

myConnection.State != ConnectionState.Open

karena Negara dapat memiliki banyak bendera.


Saya bertanya-tanya mengapa ini enum dengan bendera. Karena nilai item Tutup dari enum ini adalah nol maka State.HasFlag (ConnectionState.Close) akan mengembalikan nilai true untuk nilai apa pun. Bagi saya itu berarti bahwa saya harus memeriksa sebagai "! = Tutup"
Ivan


4
CATATAN: Saya merasa perlu untuk menyebutkan bahwa tautan Ivan menyebutkan bahwa Anda TIDAK BOLEH menggunakan ini sebagai bendera. Lihat jawaban spesifik ini: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

Periksa apakah koneksi MySQL terbuka

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

Apa tujuan kembali selalu benar? Pada tahap ini, batalkan metode tersebut. Cuma, periksa apakah koneksi tidak terbuka dan jika sudah buka. Dan ... kenapa menulis 2 kali return true;? letakkan di akhir metode, di luar if/ else!
Massimiliano Kraus

Jika terjadi masalah jaringan, ini akan memberikan jawaban yang salah. Anda tidak dapat memastikan bahwa kemauan terbuka memang terbuka.
pengguna613326

@ user613326 sebenarnya, tidak akan. Tidak ada penanganan kesalahan dalam kode contoh, jadi masalah apa pun saat menghubungkan hanya akan membuat Anda menangani pengecualian. Oleh karena itu, nilai yang dikembalikan benar.
Tom Lint

6

Anda juga bisa menggunakan ini

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

1
using System.Data;untuk siapa pun yang tidak tahu, atau tidak tahu mengapa itu tidak berhasil
Coops

5

Kode ini sedikit lebih defensif, sebelum membuka koneksi, periksa status. Jika status koneksi Rusak maka kita harus mencoba menutupnya. Rusak berarti koneksi sebelumnya dibuka dan tidak berfungsi dengan benar. Kondisi kedua menentukan bahwa status koneksi harus ditutup sebelum mencoba membukanya lagi sehingga kode dapat dipanggil berulang kali.

// Defensive database opening logic.

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

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

Hanya menjadi sedikit lebih defensif.
GBGOLC

1
Dari antrean tinjauan: Bolehkah saya meminta Anda untuk menambahkan konteks lain di sekitar jawaban Anda. Jawaban hanya kode sulit untuk dipahami. Ini akan membantu penanya dan pembaca yang akan datang jika Anda dapat menambahkan lebih banyak informasi dalam posting Anda. Lihat juga Menjelaskan jawaban sepenuhnya berbasis kode .
help-info.de

3

Untuk memeriksa status koneksi database, Anda cukup melakukan hal berikut ini

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

2

Untuk memeriksa Status OleDbConnection gunakan ini:

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

State mengembalikan ConnectionState

public override ConnectionState State { get; }

Berikut adalah ConnectionStateenum lainnya

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

Saya menggunakan cara berikut sqlconnection.state

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

7
connectionState.open()tidak ada; yang Anda maksud ConnectionState.Open?
Peter Ritchie
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.