SQL Bağlantısının Açık mı Kapalı mı olduğunu kontrol edin


102

Açık mı kapalı mı kontrol ediyorsun ben kullanıyordum

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

ancak, Devlet 'Açık' olsa bile bu kontrolde başarısız olur.

Yanıtlar:


175

SqlConnection.State kullanmalısınız

Örneğin,

using System.Data;

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

2
Tam olarak +1 - SqlConnectionStatenumaralandırmayı bir sıralama olarak kullanın ve bir dizeye dönüştürmeyin .....
marc_s

4
Ekledik Should using System.Data;cevap, IMHO. Bu ad alanını unuttum (vardı using System.Data.SqlClient) ve ConnectionStateekleyene kadar anahtar kelime olarak nasıl alınacağını bulamadım . Umarım bu birine yardımcı olur.
vapcguy

Sunucu (veya yerel makine ile sunucu arasındaki bir şey) bağlantıyı kapatırsa bu işe yarar mı ?
jpmc26

Söylesem daha iyi olmaz if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }mı? Bu şekilde, bağlantı boşsa, aynı zamanda "kapalıdır".
Arvo Bowen

52

İşte kullandığım şey:

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

Sadece kullanmama nedenim:

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

Bunun nedeni, ConnectionState'in ayrıca:

Broken, Connnecting, Executing, Fetching

Ek olarak

Open, Closed

Ayrıca Microsoft, Kapatmanın ve ardından bağlantıyı yeniden açmanın "Durum değerini yenileyeceğini" belirtir. Buraya bakın http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.ConnectingYavaş bağlantılarla sıfırlamaları önlemek için test etmelisiniz, değil mi?
kaligari

@caligari Doğru olsa da, DbConnection için hiçbir garanti yoktur, bu nedenle soyut DbConnection'a programlama yapıyorsanız dikkatli olun.
John Zabroski

1
Şahsen bunun kaçınarak çözdüğünüz bir problem olduğunu düşünüyorum. Bu kod parçacığının kullanım durumunu durum bilgisi olan bir uygulama katmanında görebilirim, ancak Web'de asla?
John Zabroski

John, bu kodun tam olarak kullanım durumu budur. Sayfalara hizmet edebilecek, başka bir REST sunucusuna bağlanabilecek bir sunucu uygulamasını çalıştıran kod. Bir web uygulamasında istemci tarafı kodunda bir sunucu veritabanına bağlanacağım herhangi bir durum görmüyorum.
therealjumbo

Bununla ilgili dev bir uyarı var: 1) Yerel Depolama artık bir şey haline geldiğinde, er ya da geç (zaten?) Yerel depolamayı kullanan web uygulamaları bu depoda bir veritabanı kullanacak. Şimdi değilse, kısa süre sonra yapacaklar. Buradaki diğer şey ise, kodum muhtemelen büyük bir uygulamada kullanılmak üzere düzgün bir şekilde genelleştirilmemiştir. Ana odak noktam gömülü programlama, bu yüzden hala sunucu tarafında öğreniyorum.
therealjumbo

24

.NET belgeleri şunu söylüyor: Durum Özelliği: ConnectionState değerlerinin bit düzeyinde bir kombinasyonu

Bu yüzden kontrol etmen gerektiğini düşünüyorum

!myConnection.State.HasFlag(ConnectionState.Open)

onun yerine

myConnection.State != ConnectionState.Open

çünkü Eyalet birden fazla bayrağa sahip olabilir.


Bunun neden bayraklarla enum olduğunu merak ediyorum. Bu numaralandırmanın Close öğesinin değeri sıfır olduğundan, State.HasFlag (ConnectionState.Close) herhangi bir değer için true döndürür. Benim için bu, "! = Kapat" olarak kontrol etmem gerektiği anlamına geliyor
Ivan


4
NOT: Ivan'ın bağlantısının bunu bayraklar olarak KULLANMAMANIZ GEREKENLERDEN bahsettiğini belirtmenin gerekli olduğunu düşünüyorum. Bu özel yanıta bakın: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

MySQL bağlantısının açık olup olmadığını kontrol edin

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

Her zaman doğru şekilde geri dönmenin amacı nedir? Bu noktada yöntemi geçersiz kılın. Yalnızca bağlantının açık olup olmadığını kontrol edin ve varsa açın. Ve ... neden 2 kez yazasınız return true;? bunu yöntemin sonuna, if/ else!
Massimiliano Kraus

Ağ sorunları olması durumunda, bunlar yanlış cevap verecektir. açmanın gerçekten açılacağından emin olamazsınız.
user613326

@ user613326 aslında olmazdı. Örnek kodda herhangi bir hata işleme yoktur, bu nedenle bağlantı sırasında herhangi bir sorun basitçe fırlatır ve istisnayı halletmeniz için sizi bırakır. Bu nedenle döndürülen değer doğrudur.
Tom Lint

6

bunu da kullanabilirsin

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

1
using System.Data;bilmeyen veya neden çalışmadığını bilmeyenler için
Coops

5

Bu kod biraz daha savunmacıdır, bir bağlantıyı açmadan önce durumu kontrol edin. Bağlantı durumu Bozuk ise kapatmaya çalışmalıyız. Bozuk, bağlantının daha önce açıldığı ve düzgün çalışmadığı anlamına gelir. İkinci koşul, kodun tekrar tekrar çağrılabilmesi için yeniden açmaya çalışmadan önce bağlantı durumunun kapatılması gerektiğini belirler.

// Defensive database opening logic.

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

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

Sadece biraz daha savunmacı davranıyorum.
GBGOLC

1
İnceleme kuyruğundan: Cevabınıza biraz daha bağlam eklemenizi rica edebilir miyim? Yalnızca kod yanıtlarını anlamak zordur. Gönderinize daha fazla bilgi ekleyebilirseniz, soruyu soran kişiye ve gelecekteki okuyuculara yardımcı olacaktır. Ayrıca bkz. Tamamen kod tabanlı yanıtları açıklama .
help-info.de

3

Veritabanı bağlantı durumunu kontrol etmek için aşağıdakileri yapmanız yeterlidir

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

2

OleDbConnection Durumunu kontrol etmek için şunu kullanın:

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

State geri dönmek ConnectionState

public override ConnectionState State { get; }

İşte diğer ConnectionStatenumaralandırma

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

Ben şu şekilde kullanıyorum sqlconnection.state

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

7
connectionState.open()yok; bunu mu demek istediniz ConnectionState.Open?
Peter Ritchie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.