2016-10-13 16 views
0

IDataReader 인터페이스를 사용하여 nullable datetime을 다시 읽습니다. 지금까지 필자의 이전 칼럼 읽기는 예상대로 작동합니다.데이터 판독기를 사용하여 Null 허용 datetime 값을 문자열로 변환하는 방법은 무엇입니까?

nullable 날짜 시간을 다시 읽으려고이 열 ["Implementation End Timestamp"]을 제외하고 문자열로 변환하고 Implementation_End_String이라는 문자열 속성에 할당합니다.

그래서 내가 시도한 것입니다. 먼저 DateTime? 값을 읽고 null을 검사 한 다음 null이 아닌 경우 toString()을 변환하려고 시도합니다.

그러나이 할당이 때문에 그들의 존재하지에 허용되지 않습니다 "문자열과 날짜 시간 사이에 명시 적 변환?"

Implementation_End_String = dataReader["Implementation End Timestamp"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(dataReader["Implementation End Timestamp"]).ToString("d-MMMM-yyyy"), //show full month name 

나는) (나는 toString을 호출하는 날짜 시간의 value을받을 필요가 있다고 생각 그 위에.

질문 :

가 어떻게 문자열 유형으로 다시 읽어 DateTime? 값을 변환 할 수 있습니까?

+0

필드에 DateTime이 포함되어 있다고 가정하면 왜 문자열로 변환 한 다음 다시 DateTime으로 변환 하시겠습니까? – Steve

+0

'Implementation_End_String'이 문자열 속성이 아니므로, 읽어 들인'[ "Implementation End Timestamp"]'날짜를 짧은 달 형식의 문자열 표현으로 변환하고 싶습니다. 그런 다음 문자열 변수에 할당하십시오. 더 이해가됩니다. –

답변

3

모든 Nullable<T> 유형은 GetValueOrDefault 메소드를가집니다. 값이 없으면이 메소드를 사용하여 T 값 (기본값은 DateTime.MinValue)을 검색 할 수 있습니다. 이 메서드는 일반 DateTime 개체를 반환하므로 ToString() 메서드를 호출 할 수 있습니다.

+2

아아 그러면 필자는 문서를 읽었어야했다. ;) –

+0

언제나 문서를 읽는 것이 좋다 ;-) –

+1

내가 말한 것처럼 - 문서를 읽는 것이 좋다! 'GetValueOrDefault'는'T' 타입의 디폴트 값을 반환합니다. 그러므로 여러분의 경우에는 날짜가 01/01/0001 00:00:00이 될 것입니다. 기본값 인'DateTime' 값이기 때문입니다. 따라서 null이 아니고 'DateTime.MinValue'가 아닌지 확인하지 않아야합니다. 혼란을 드려 죄송합니다! Google에서이 질문을 할 수 있도록 답변을 업데이트했습니다 .-) –

3

IDataReader은 꽤 오래된 인터페이스이므로 기본적으로 nullable 유형을 지원하지 않습니다. 코드의 여러 위치에서 사용하는 경향이 있다면 코드를 크게 줄이는 도우미를 만드는 것이 좋습니다. 예를 들어, 여기 DateTime?위한 도우미 메서드, 당신은 쉽게 다른 유형의 유사 할 수 있습니다 :

public static class DataReaderExtensions 
{ 
    public static DateTime? GetNullableDateTime(this IDataReader source, string name) 
    { 
     return source.GetNullableDateTime(source.GetOrdinal(name)); 
    } 
    public static DateTime? GetNullableDateTime(this IDataReader source, int i) 
    { 
     return !source.IsDBNull(i) ? source.GetDateTime(i) : (DateTime?)null; 
    } 
} 

이의 C#6 null conditional operator와 함께 간단한 것과 문제의 작업을 할 것 :

Implementation_End_String = dataReader 
    .GetNullableDateTime("Implementation End Timestamp")?.ToString("d-MMMM-yyyy") ?? ""; 
+0

좋은 아이디어입니다.'.Value.ToString ("d-MMMM-yyyy") ?? "",'문자열로? –

+0

toString 앞에 .value를 사용하면 Nullable 객체에 값이 있어야합니다. "오류가 발생합니다. '? .String ("d-MMMM-yyyy") ?? "",하지만 해당 할당에 대한 구문 오류가 발생합니다. –

+0

아니요, '.Value'가 아니어야합니다. 구문 오류가 발생하는 경우 VS2015를 사용하지 않는 것입니다 (C# 6 참고). –