Verifique se a conexão SQL está aberta ou fechada


102

Como você verifica se ele está aberto ou fechado?

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

no entanto, mesmo o Estado é 'Aberto', ele falha nesta verificação.

Respostas:


175

Você deve usar SqlConnection.State

por exemplo,

using System.Data;

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

2
+1 exatamente - use o SqlConnectionStateenum como um enum e não o transforme em uma string .....
marc_s

4
Deveria ter adicionado using System.Data;na resposta, IMHO. Esqueci esse namespace (tinha using System.Data.SqlClient) e não consegui descobrir como obter ConnectionStateuma palavra-chave até adicioná-lo. Espero que isso ajude alguém.
vapcguy

Isso funciona se o servidor (ou algo entre a máquina local e o servidor) fechou a conexão?
jpmc26

Não seria melhor dizer if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }? Assim, se a conexão for nula, ela também será "fechada".
Arvo Bowen

52

Aqui está o que estou usando:

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

A razão pela qual não estou simplesmente usando:

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

É porque o ConnectionState também pode ser:

Broken, Connnecting, Executing, Fetching

Além de

Open, Closed

Além disso, a Microsoft afirma que Fechar e, em seguida, reabrir a conexão "atualizará o valor do Estado". Veja aqui http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


Você deve testar se é mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connectingpara evitar reinicializações com conexões lentas, não é?
Caligari,

@caligari Embora verdadeiro, não existe garantia para DbConnection, portanto, se estiver programando para o DbConnection abstrato, tome cuidado.
John Zabroski de

1
Pessoalmente, acho que esse é o tipo de problema que você resolve evitando. Posso talvez ver o caso de uso para este trecho de código em uma camada de aplicativo com estado, mas nunca na Web?
John Zabroski de

John, esse é exatamente o caso de uso para este código. Código executando um aplicativo de servidor que poderia estar servindo páginas, conectando-se a outro servidor REST de qualquer maneira. Não vejo nenhum caso em que eu conectaria a um banco de dados do servidor no código do lado do cliente em um aplicativo da web.
realjumbo de

Há uma advertência gigantesca com isso: 1) com o armazenamento local agora se tornando uma coisa, mais cedo ou mais tarde (já?) Aplicativos da web que usam armazenamento local vão usar um banco de dados nesse armazenamento. Se não agora, eles o farão em breve. A outra coisa aqui é que meu código provavelmente não foi generalizado de maneira apropriada para ser usado em um grande aplicativo. Meu foco principal é a programação embarcada, então ainda estou aprendendo no lado do servidor.
realjumbo de

24

A documentação do .NET diz: Propriedade de estado: uma combinação bit a bit dos valores de ConnectionState

Então eu acho que você deve verificar

!myConnection.State.HasFlag(ConnectionState.Open)

ao invés de

myConnection.State != ConnectionState.Open

porque o estado pode ter vários sinalizadores.


Eu me pergunto por que isso é enum com sinalizadores. Como o valor do item Close deste enum é zero, então State.HasFlag (ConnectionState.Close) retornará verdadeiro para qualquer valor. Para mim, isso significa que devo marcar como "! = Fechar"
Ivan


4
NOTA: Acho necessário mencionar que o link do Ivan menciona que NÃO DEVE ser usado como sinalizadores. Veja esta resposta específica: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

Verifique se uma conexão MySQL está aberta

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

Qual é o propósito de retornar sempre verdadeiro? Neste ponto, torne o método vazio. Apenas verifique se a conexão não está aberta e, se estiver, abra-a. E ... por que escrever 2 vezes return true;? coloque no final do método, fora do if/ else!
Massimiliano Kraus

Em caso de problemas de rede, isso daria uma resposta errada. você não pode ter certeza de que abrir realmente abrirá.
user613326

@ user613326 na verdade, não. Não há tratamento de erros no código de exemplo, portanto, quaisquer problemas durante a conexão simplesmente lançarão e deixarão você lidar com a exceção. O valor retornado está, portanto, correto.
Tom Lint

6

você também pode usar isso

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

1
using System.Data;para qualquer um que não soubesse ou não soubesse por que não estava funcionando
Coops

5

Este código é um pouco mais defensivo, antes de abrir uma conexão, verifique o estado. Se o estado da conexão for interrompido, devemos tentar fechá-la. Quebrado significa que a conexão foi aberta anteriormente e não está funcionando corretamente. A segunda condição determina que o estado da conexão deve ser fechado antes de tentar abri-lo novamente para que o código possa ser chamado repetidamente.

// Defensive database opening logic.

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

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

Apenas sendo um pouco mais defensivo.
GBGOLC

1
Da fila de revisão: Peço que adicione mais contexto em torno de sua resposta. Respostas apenas em código são difíceis de entender. Ajudará tanto o autor da pergunta quanto os futuros leitores se você puder adicionar mais informações em sua postagem. Consulte também Explicando respostas inteiramente baseadas em código .
help-info.de

3

Para verificar o estado de conexão do banco de dados, você pode simplesmente fazer o seguinte

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

2

Para verificar o estado OleDbConnection, use isso:

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

State devolver o ConnectionState

public override ConnectionState State { get; }

Aqui estão os outros ConnectionStateenum

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

Eu uso a seguinte maneira sqlconnection.state

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

7
connectionState.open()não existe; você quis dizer ConnectionState.Open?
Peter Ritchie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.