2013-07-30 2 views
0

Oracle 데이터베이스에서 여러 날짜를 읽고이를 DateTimePickers에 할당하는 응용 프로그램을 사용하고 있습니다. DB를의 값이 null 될 수 있기중복 Null 검사 피하기 (사용자 컨트롤을 매개 변수로 전달)

dtpAdjSerDt.Value = dr.GetDateTime(iadj_service_date); 

그러나,이 할당은 NULL 체크가 필요합니다.

값이 null이면 기본값을 반환하는 확장 메서드를 만들 수 있기를 원합니다.

public static DateTime fSafeGetDateTime(OracleDataReader reader, int colIndex) 
{ 
    if (!reader.IsDBNull(colIndex)) 
     return reader.GetDateTime(colIndex); 
    else 
     return DateTime.Now; 
} 

이 접근 방식에는 한 가지 문제점이 있습니다. db 값이 null 인 경우 DateTimePicker.Checked는 false 여야합니다. 그러나 위에서 제안한 전략을 사용하면 사실로 설정됩니다. 이 이러한 목표를 달성하기 위해 (중복 코드를 방지) 가장 깨끗한 방법이 될 것입니다 무엇을 할 수없는 경우

public static DateTime fSafeGetDateTime(OracleDataReader reader, int colIndex, DateTimePicker control) 
{ 
    if (!reader.IsDBNull(colIndex)) 
     return reader.GetDateTime(colIndex); 
    else 
    { 
     control.Checked = false; 
     return DateTime.Now; 
    } 
} 

:

나에게 이런 일을 할 수있는 방법이 있습니까?

public static DateTime? SafeGetDateTime(this OracleDataReader reader, int colIndex) 
{ 
    return reader.IsDBNull(colIndex) ? null 
            : (DateTime?) reader.GetDateTime(colIndex); 
} 

는 이제 사용할 수 있습니다 :

답변

2

난 당신이 단지 DateTime?을 반환하고 호출자가 불이행 할 수 있도록 제안

DateTime? fromReader = reader.SafeGetDateTime(1); 
if (fromReader == null) 
{ 
    control.Checked = false; 
} 
DateTime fromReaderOrNow = fromReader ?? DateTime.Now; 
:

DateTime fromReaderOrNow = reader.SafeGetDateTime(1) ?? DateTime.Now; 

을 그리고 당신은 제어 부분을 필요로하는 경우

이 실제로 인 경우 다중으로 수행해야합니다. 르 장소, 당신은 할 수있는 방법을 감쌀 수 있습니다 - 그리고 당신은 SafeGetDateTime 코드를 반복하지 않을 것입니다.

(나는 정직하게, 시작하는 당신의 UI 코드에서 더욱 우리의 데이터베이스 코드를 분리하는 것이 좋습니다 것입니다.)

+0

- 난 nullable 형식에 익숙하지 않다. 여기서 nullable 형식을 사용하면 fromReader를 초기화 할 때 런타임 오류가 발생하지 않습니까? -I DateTime fromReaderOrNow = fromReader ?? DateTime.Now; - 마지막 제안 (괄호 안)은 불가능합니다 (아키텍처를 담당하는 다른 누군가를 위해 일하고 있기 때문에). 제발 설명해 주실 수 있습니까? (예 : formReader! = null formReader : DateTime.Now) 이 예제에서 어떤 모습일까요? 정말 고마워요! – Zzz

+0

@Azzi : 다른 컨텍스트없이 어떻게 분리 할 것인가에 대한 자세한 내용은 알 수 없습니다. 어쨌든 SO 주석 스레드에는 적합하지 않습니다. 'fromReader'를 초기화 할 때 실행 오류에 대해 무슨 뜻인지 모르겠습니다. 여전히'SafeGetDateTime' 메서드를 사용하고 있습니다. 그게 오류를 방지합니다. 당신은 null 통합 연산자 ('?? ')의 의미에 대해 맞습니다. –

+0

감사합니다. 도움을 많이 받으실 수 있습니다! – Zzz