2012-04-26 2 views
4

는 I는이 코드 집합 다음 한 :중첩 된 "using"문 형식이 적절합니까?

using (OracleConnection conn = new OracleConnection(m_fceConn)) 
{ 
    conn.Open(); 

    using (OracleCommand cmd = new OracleCommand(m_sql, conn)) 
    { 
     using (OracleDataReader reader = cmd.ExecuteReader()) 
     { 
      reader.Read(); 
     } 
    } 

    conn.Close(); 
} 

이 서식을 수있는 더 나은 방법이 있나요? 나중에, 나는 아마도 연결을 열고, 쿼리를 실행하고, 연결을 나중에 별도의 함수로 닫을 것입니다. 그러나이 중첩은 말 그대로 "뒤에서"있을 것입니다.

나는 내가 그렇게 같은 일을 포맷 할 수있는 다른 스레드를 읽어 :

using (OracleConnection conn = new OracleConnection(m_fceConn)) 
using (OracleCommand cmd = new OracleCommand(m_sql, conn)) 

하지만 나는 그런 괄호를 생략 할 수 있다고 생각하지 않습니다 이러한 각 문 사이에 코드가 있음을 고려. 나는 C#에서 여전히 완전히 새롭고/멍청한 사람이기 때문에 여기서 가장 안전하고 안전한 방법을 찾고 있습니다. 감사.

+0

dispose (using) 암시 적으로 close를 호출하므로 연결을 닫을 필요가 없습니다. –

+0

@Tim Schmelter : 그 맛있는 음식에 감사드립니다. 나는 그랬다고 확신 했었지만, 나는 안심할 것만 같았습니다. 하지만, 필자는 또한 오픈 -> 읽기 <- 닫기보다 더 명확하게 이해하지 못하기 때문에 그것을 쓰는 것에 대한 묘사와 비슷합니다. 그것을 떠날 때 발생할 수있는 문제가 있습니까? – Kittoes0124

+0

@Kittoes - 아니, 문제 없음. 당신은 또한'cmd.ExecuteReader (CommandBehavior.CloseConnection)'을 할 수 있으며 연결을 닫을 것입니다. –

답변

3

내가 틀릴 수도 있지만 OracleCommand에 전달하기 전에 연결을 열어야한다고 생각하지 않습니다. 명령을 실행하기 전에 열어야합니다.

using (OracleConnection conn = new OracleConnection(m_fceConn)) 
using (OracleCommand cmd = new OracleCommand(m_sql, conn)) 
{ 
    conn.Open(); 
    using (OracleDataReader reader = cmd.ExecuteReader()) 
    { 
     reader.Read(); 
    } 
} 

(당신은 또한 자동으로 닫아야 연결 폐기 이후 중 하나를 명시 적으로 가까운 필요가 없습니다) : 그래서 당신은 위를 작성할 수 있습니다.

위의 코드에는 별다른 차이가 없습니다 (외모가 좋은 것 외). 단 한 번의 명령 만 사용하는 일반적인 C# 규칙을 사용하고 있습니다.

여러 개의 단일 명령문을 "스태킹"하는 것만 큼.

2

conn.Close()을 호출 할 필요가 없지만 올바른 형식이 지정되었으므로 연결이 선언 된 using 블록의 끝에 처리되어 닫힙니다.

그러나 두 번째 명령문의 대괄호는 한 블록 using 블록이므로 생략 할 수 있습니다.

2

첫 번째 사용 문에는 conn.Open() 전화가 있으므로 대괄호가 있어야합니다. 두 번째와 세 번째는 꽤 숙련 된 C# (필자의 경우 선호되는)이라고 명시된대로 스택 될 수 있습니다. 두 번째 생각에

0
using (OracleConnection conn = new OracleConnection(m_fceConn)) 
{ 
    conn.Open(); 

    using (OracleDataReader reader = new OracleCommand(m_sql, conn).ExecuteReader()) 
    { 
     reader.Read(); 
    } 

    conn.Close(); 
} 

편집 는이 작업을 수행하지 않습니다. 명령 개체를 처리하지 않습니다. 저는 여기서하지 말아야 할 일의 예로서 대답을 남겨 둘 것입니다.

+1

오라클 라이브러리의 다른 트릭이 아니라면 명령을 처리하지 않습니다. –

+0

아, 잘 잡으세요. 수정하는 방법이 있습니까? – therealmitchconnors

+0

언제든지 답변을 편집하거나 더 이상 관련이없는 경우 삭제할 수 있습니다. –

관련 문제