2014-06-23 6 views
0

초기화하거나 값을 지정하지 않고 MySqlDataReader를 선언하고 싶습니다. 아래 코드와 같습니다.초기화하지 않고 MySqlDataReader를 선언하십시오.

MySqlDataReader rdr; 

try 
{ /* stuff to open the MySqlDataReader and use it, not important for my question */ } 
catch (Exception e) 
{ /* error handling stuff, not important for my question */ } 
finally 
{ 
    /* code to close the reader when things have gone wrong */ 
    try 
    { 
     if (rdr != null) 
     { 
      if (rdr.IsClosed == false) 
      { 
       rdr.Close(); 
      } 
     } 
    } 
    catch (Exception e) 
    { /* error handling stuff, not important for my question */ } 
} 

그 이유는 내가 내가 런타임 오류가 발생 할 사실 않을 경우 시도의 마지막 섹션에 MySqlDataReader을 닫아야 할 것입니다. 따라서 MySqlDataReader는 try보다 먼저 선언해야합니다. 그렇지 않으면 finally 코드의 범위를 벗어납니다. 나는 그래서 예를

MySqlDataReader rdr = New MySqlDataReader(); 

위해 뭔가로 설정하려는 컴파일 시간 오류 " 'RDR'할당되지 않은 지역 변수의 사용을"얻을 위의 코드를 컴파일하지만 때

그러나이 나에게 컴파일을 제공 시간 오류 " 'MySql.Data.MySqlClient.MySqlDataReader'형식에 생성자가 정의되지 않았습니다." 그리고 명령 객체의 결과를 할당하면 코드가 잘못 컴파일 될 수 있으며 내 시도가 잡으려고합니다.

MySqlDataReader 개체가 첫 번째 반복에서 닫히지 않으면이 함수를 두 번째로 호출하면 두 번째로 충돌이 발생합니다.

그렇다면 잘못되었을 때 MySqlDataReader 개체를 정리하려면 어떻게해야합니까? 당신은 이미 잘 그래서 그것이, 샘플 코드에서 finally 블록 내에서 널 (null)의 여부를 확인하고, 결국

MySqlDataReader rdr = null; 

:

답변

2

null으로 지정하십시오. 컴파일러는 null이지만 값이 할당되었음을 알 수 있습니다. 당신의 finally 블록에서

MySqlDataReader rdr = null; 

null 값을 확인한다.

MySqlDataReader rdr = null; 

try 
{ 
    ... // do stuff here 
} 
finally 
{ 
    if (rdr != null) 
    { 
     // cleanup 
    } 
} 

또는 사용 using 가능한 경우. 당신을 위해 rdr을 정리합니다 :

using (MySqlDataReader rdr = ...) 
{ 
} 
1

하나의 옵션은 시작하는 null로 초기화하는 것입니다.

using 문을 사용하는 이유가 분명하지 않습니다. 당신은 항상 try/catch를 내부 (또는 외부)에 둘 수 있습니다.

관련 문제