SQL 연결이 열려 있는지 또는 닫혀 있는지 확인


102

내가 사용하고 있던 열려 있는지 닫혀 있는지 어떻게 확인합니까?

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

그러나 State가 'Open'인 경우에도이 검사에서 실패합니다.

답변:


175

SqlConnection.State를 사용해야합니다.

예 :

using System.Data;

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

2
+1 정확히- SqlConnectionState열거 형을 열거 형으로 사용하고 문자열로 변환하지 마십시오 .....
marc_s

4
using System.Data;대답에 IMHO를 추가해야했습니다 . 이 네임 스페이스를 잊어 버렸고 (가 using System.Data.SqlClient) ConnectionState추가 할 때까지 키워드 로 얻는 방법을 알아낼 수 없었 습니다. 이것이 누군가를 돕기를 바랍니다.
vapcguy 2015 년

서버 (또는 로컬 머신과 서버 사이의 무언가)가 연결을 종료 한 경우에도 작동합니까 ?
jpmc26

말하는 것이 낫지 if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }않습니까? 이렇게하면 연결이 null 인 경우에도 "닫힌"상태가됩니다.
Arvo Bowen 2017 년

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 2014

@caligari 사실이지만 DbConnection에 대한 보장은 없으므로 추상 DbConnection으로 프로그래밍하는 경우주의하십시오.
John Zabroski

1
저는 개인적으로 이것이 당신이 피함으로써 해결하는 문제라고 생각합니다. 상태 저장 애플리케이션 계층에서이 코드 조각의 사용 사례를 볼 수 있지만 웹에서는 볼 수 없습니까?
John Zabroski

John, 이것이 바로이 코드의 사용 사례입니다. 페이지를 제공 할 수있는 서버 애플리케이션을 실행하는 코드로 다른 REST 서버에 무엇이든 연결합니다. 웹 애플리케이션의 클라이언트 측 코드에서 서버 데이터베이스에 연결하는 경우는 보이지 않습니다.
therealjumbo 2014

이에 대한 한 가지 큰주의 사항이 있습니다. 1) 이제 로컬 스토리지가 현실화됨에 따라 조만간 (이미?) 로컬 스토리지를 사용하는 웹 앱이 해당 스토리지의 데이터베이스를 사용할 것입니다. 지금이 아니면 곧있을 것입니다. 여기에있는 또 다른 점은 내 코드가 대규모 응용 프로그램에서 사용되도록 적절하게 일반화되지 않았을 수 있다는 것입니다. 내 주요 초점은 임베디드 프로그래밍이므로 여전히 서버 측에서 배우고 있습니다.
therealjumbo 2014

24

.NET 문서에 따르면 상태 속성 : ConnectionState 값의 비트 조합

그래서 확인해야 할 것 같아요

!myConnection.State.HasFlag(ConnectionState.Open)

대신에

myConnection.State != ConnectionState.Open

State는 여러 플래그를 가질 수 있기 때문입니다.


왜 이것이 플래그가있는 열거 형인지 궁금합니다. 이 열거 형의 Close 항목 값이 0이므로 State.HasFlag (ConnectionState.Close)는 모든 값에 대해 true를 반환합니다. 저에게는 "! = Close"로 확인해야한다는 의미입니다.
Ivan


4
참고 : Ivan의 링크에서 이것을 플래그로 사용해서는 안된다는 것을 언급해야한다고 생각합니다. 이 특정 답변을 참조하십시오 stackoverflow.com/a/35484965/2499090
브렌트 리튼 하우스

9

MySQL 연결이 열려 있는지 확인

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

항상 진실로 돌아가는 목적은 무엇입니까? 이 시점에서 메서드를 무효화합니다. 연결이 열려 있지 않은지 확인하고 열려 있는지 확인하십시오. 그리고 ... 왜 2 번 쓰는 return true;거죠? 메소드의 끝에 if/ 외부에 넣으십시오 else!
Massimiliano Kraus

네트워크 문제의 경우 잘못된 답변을 제공합니다. 오픈이 실제로 열릴 지 확신 할 수 없습니다.
user613326

@ user613326 실제로는 그렇지 않습니다. 예제 코드에는 오류 처리가 없으므로 연결 중 문제가 발생하면 예외를 처리 할 수 ​​있습니다. 따라서 반환 된 값은 정확합니다.
Tom Lint

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?
Peter Ritchie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.