2013-05-22 2 views
2

사람들이 Sqlconnection에 대해 대부분의 시간 동안 데이터베이스 연결에 대해 고려할 때 System.Data 네임 스페이스 내에 있습니다.Mysql은 6.3.6에서 연결을 C# (Mysqlconnection)에서 처리 할 때 닫습니까?

지난 번 포럼에서 나는 MySQL에서()을 사용하고 있어도 conn.close()를 호출해야한다고 읽었습니다.

확실하지 않습니다. 나는 MySQL의 경우에 대해 확신 할 수 없다. MySQL에 연결하는 C# 코드가 있습니다.

이 코드는 절대로 닫지 않은 일부 연결을 엽니 다. 코드를 확인하고 싶습니다. 어떻게 연결이 닫혔는지 확인할 수 있습니다.

나는 무엇보다도 mysqlconnection을 자동으로 닫는 방법을() 확인하는 것을 의미합니다. 둘째 어떻게 여전히 연결을 닫지 코드를 디버깅 할 수 있습니다.

누구에게 연결이 열려 있고 닫히지 않은지 알 수있는 좋은 방법이 있습니까?

MySqlConnection cnn = new MySqlConnection(Globals.CONNSTRING); 
      cnn.Open(); 


      using (cnn) 
{ 
} 

이 샘플 코드를 추가하면 누군가 자동으로 연결을 종료하는지 알 수 있습니다.

답변

5

닷넷 용 MySql Connector의 소스 코드는 MySql Site에서 얻을 수 있습니다. 당신이 그들을 다운로드 MySqlConnection의 폐기 방법을 보면 당신은 참조하십시오

protected override void Dispose(bool disposing) 
{ 
    if (State == ConnectionState.Open) 
    Close(); 
    base.Dispose(disposing); 
} 

하지만이 버전 6.5.6에 대한 소스는 것을 지적해야합니다. 버전 6.3.6의 소스 코드를 찾을 수 없습니다. 그러나 이전 버전 (6.1.6)에는 동일한 코드가 있습니다.

코드를 보면 조금 이상하고 위험합니다. 열기가 연결이 배치됩니다 FAIS 경우
보통 일반적인 사용 패턴이 방법으로 다음과 같은

using(MySqlConnection cnn = new MySqlConnection(Globals.CONNSTRING)) 
{ 
    cnn.Open(); 
    ...... 
} 

입니다. 코드에서는 using 문을 입력하지 않기 때문에 발생하지 않습니다.

마지막으로,이 (단지 가짜 유효하지 않은 연결 문자열을 추가) 위의 코드에 의해 생성 된 IL 코드를 다음

IL_0000: ldstr  "test" 
IL_0005: newobj  MySql.Data.MySqlClient.MySqlConnection..ctor 
IL_000A: stloc.0  // cnn 
IL_000B: ldloc.0  // cnn 
IL_000C: callvirt System.Data.Common.DbConnection.Open 
IL_0011: ldloc.0  // cnn 
IL_0012: stloc.1  // CS$3$0000 
IL_0013: leave.s  IL_001F 
IL_0015: ldloc.1  // CS$3$0000 
IL_0016: brfalse.s IL_001E 
IL_0018: ldloc.1  // CS$3$0000 
IL_0019: callvirt System.IDisposable.Dispose 
IL_001E: endfinally 

놀랄 것입니다. 연결이 닫히고 처리되었습니다.

+0

using() 내부 또는 외부에서 연결을 열어도 상관 없습니다. 둘 다 처분하고 연결을 닫습니다. – user2126670

+0

예, 사용중인 개체가 처리되고 코드가 이상하고 위험합니다. 연결을 열지 못하면 사용은 처리하고 닫지 않습니다. – Steve

+0

@ 스티브 응용 프로그램에서 IL을 어떻게 볼 수 있습니까? 어떤 응용 프로그램을 사용하고 있습니까? –

관련 문제