2016-06-24 9 views
0

참고 :이 하지입니다 내가 특별히 열 인덱스지정한 캐스트가 잘못되었습니다

을 사용하지 않도록 할뿐만 how-to-get-nullable-datetime-out-of-the-database의 중복 I 다음 개체

public class MyClass 
{ 
    public int ID { get; set; } 
    public DateTime? Deleted { get; set; } 
} 
에게 있습니다 삭제 날짜가 NUL은

MyClass c = new MyClass(); 
using (SqlConnection conn = new SqlConnection()) 
{ 
    conn.ConnectionString = "MyConnectionString"; 
    SqlCommand cmd = new SqlCommand("SELECT ID,Deleted FROM MyTable", conn); 
    conn.Open(); 
    SqlDataReader sdr = cmd.ExecuteReader(); 
    if (sdr != null && sdr.HasRows) 
    { 
     while (sdr.Read()) 
     { 
      c.CampID = (int)sdr["ID"]; 
      c.Deleted = (DateTime?)sdr["Deleted"]; 
     } 
     sdr.Close(); 
    } 
    conn.Close(); 
} 
return c; 

경우

다음 코드는 데이터베이스에서 상기 물체를 추출 리터 나는

지정한 캐스트가 내가 잘못 뭐하는 거지

유효하지 않은 오류가? 이런 식으로 Nullable datetime 필드를 캐스팅 할 수 있습니까?

저는 두 가지 못생긴 해킹으로 작업이 완료됩니다. 이 :

try{ 
    c.Deleted = (DateTime?)sdr["Deleted"]; 
} 
catch{ 
    // ignoring a catch makes me feel unclean 
} 

또는이

if(!string.isNullOrEmpty(sdr["Deleted"].ToString())) 
{ 
    // not quite so bad, but still not very elegant 
    c.Deleted = (DateTime?)sdr["Deleted"]; 
} 

청소기가 있는가, 더 우아한 방법은이 작업을 수행하려면?

참고 :이

c.Deleted = sdr["Deleted"] == DBNull.Value ? 
        (DateTime?)null : Convert.ToDateTime(sdr["Deleted"]); 

답변

0

희망을 사용하는을 원하지 않는 :

c.Deleted = sdr["Deleted"] as DateTime?; 
+0

'에 대한 검사 DBNull.Value'는 그 자체로 충분하고 명확 합니다만, 값이 이미 있다면'Convert.ToDateTime'을 사용해야하는 이유는 무엇입니까? 'DateTime'으로 알려진가? 나는 그것이 틀렸다는 것을 말하는 것이 아니며,이 대답은 단순한 코드보다는 설명으로 이익을 얻을 수 있다고 말하고 있습니다. – hvd

-1

시험이 도움이되는 즉, 필드 인덱스,

sdr.GetDateTime(i); 
+0

원래 코드가 'null'을 반환하는 현재 시간의 기본값은 무엇입니까? 왜 'as DateTime?'이 아닌가? –

+1

이것은 컴파일되지 않아야합니다. – hvd