2009-07-07 3 views
1

안녕 안녕하세요 잠재적으로 null 날짜 값을 가질 수있는 컬렉션을 반환하는 중입니다. 그러나 null 인 경우 - 대신 그 대신 임의의 날짜를 사용하고 싶습니다. 이 문자열 인 경우null 날짜 처리 db

, 나는 이렇게 같은 널 (null)를 확인 것 :

calEventDTO.occurrenceType = dr.IsDBNull(10) ? null : dr.GetString(10); 

어떻게 날짜를 같은 행동을 할 것인가? 다음은 컴파일되지 않습니다 ('null'과 System.DateTime 사이에는 암시 적 변환이 없습니다).

calEventDTO.recurrenceID = dr.IsDBNull(9) ? null : dr.GetDateTime(9); 

My dto는 null 값을 처리하도록 설정됩니다.

public DateTime? recurrenceID 
    { 
     get { return _recurrenceID; } 
     set { _recurrenceID = value; } 
    } 

모든 힌트/도움/포인터가 많이 감사하겠습니다. 감사

답변

8

시도 :

calEventDTO.recurrenceID = dr.IsDBNull(9) ? null : (DateTime?) dr.GetDateTime(9); 

? 연산자는 두 피연산자 (null 및이 경우 dr.GetDateTime (9))가 동일한 유형이어야합니다.

+0

당신은 남자 야! 감사! – user17510

5

조건 연산자는 일반적으로 훨씬 느립니다 당신이, 당신은 그래서 날짜 시간?

calEventDTO.recurrenceID = dr.IsDBNull(9) ? (DateTime?)null : dr.GetDateTime(9); 
0

IsDbNull (INT)에 피연산자 중 하나를 캐스팅하기 위해 결과를 할당하는 것을 고려하지 않는 등의 방법을 사용하여 GetSqlInt32 다음 DBNull.Value에 비교하거나 자신의 .IsNull 등을 사용하여 :

public static int Int32(this SqlDataReader r, int ord) 
    { 
     var t = r.GetSqlInt32(ord); 
     return t.IsNull ? default(int) : t.Value; 
    } 

지금까지 몇 가지 템플릿 솔루션을 시도했지만 아무 소용에. 문제는 모든 Sql 유형 (SqlInt32 여기) 유형은 실제로 구조체이며 모두가 .Value 특성을 갖지만 C#에는이를 처리 할 실제 템플릿이 없다는 것입니다. 또한 그들은 .IsNull 만 가지고 있고 Nyllable <>과 호환되지 않는 자체 Inullable 인터페이스를 가지고 있습니다.

하나 또는 두 개의 템플릿 메서드를 가질 수 있으려면 C# 템플릿으로 전체 Sql 유형 집합이 필요하거나 ICOnvertible을 추가해야한다고 생각합니다.

누군가가 기능적 트릭을 가진 아이디어를 갖고 있거나 2 명이 위로 말하면 :-)