2012-01-05 4 views
5

항상 사용했던 동일한 코드를 다시 사용하려고하는데 오류가 발생했습니다.Nullable 객체는 # 2 값을 가져야합니다.

나는 다양한 사용자 테이블을 통해 반복하고있어, 거기에서 나는이 작업을 수행 : 루프 내부

DateTime dcdt = (DateTime)u.DateCreated; 
DateTime lldt = (DateTime)u.LastLogon; 
userRow["DateCreated"] = dcdt.ToShortDateString(); 

. 대신 먼저 "dcdt"의,

System.InvalidOperationException: Nullable object must have a value. 

오류 하이라이트 "lldt"라인 : 나는 오류가 발생합니다. 그것은 그 자체로 이상합니다. "allow nulls"데이터베이스의이 두 필드가 모두 선택됩니다. 그리고 그것들은 모두 null 일 수도 있고 둘 다 null 일 수도 있습니다.

두 값은 모두 DateTime으로 나열되어 있습니까? Intellisense를 통해 유형.

왜 ASP.NET이 널 날짜로 공백을 출력하는 것을 거부하는지 이해할 수 없습니다. 비어 있거나 null이면 ASP.NET은 아무 것도 인쇄하지 말아야한다는 논리를 제안합니다.

그 밖의 다른 방법으로 null 날짜를 출력한다고 가정합니다. null DateTimes를 캐스팅하지 못하도록 if 문을 추가하려고 시도했지만 도움이되지 않습니다.

답변

12

앞서 말씀 드린대로 u.LastLogon의 데이터 형식은 DateTime?입니다. 이는 값이 있거나 없을 수 있음을 의미합니다. DateTime으로 전송하면 값이 필요합니다. 이 경우에는 그렇지 않습니다.

userRow["LastLogon"] = u.LastLogin.HasValue ? 
         (object) u.LastLogin.ToShortDateString() : DBNull.Value; 
가 데이터베이스 LastLogon 열이 날짜 시간 유형 인

경우에, 당신은 할 수 있어야한다 :

당신이 그것으로 뭘 하려는지에 따라, 당신은 HasValue 속성을 확인 할 수 있습니다 해야 할 일 :

userRow["LastLogon"] = u.LastLogin.HasValue ? 
         (object) u.LastLogin.Value : DBNull.Value; 
+0

그럼 어떻게해야합니까? 나는 던지지 않습니까? DateTime에 ShortDateString()을 계속 사용합니까? DateTime 대신에? – Dexter

+0

열 유형이 DateTime –

+1

인 경우 내 업데이트보기'u.LastLogon.Value.ToShortDateString()'이 (가) 어떻게 작동하지 않습니까? –

1

문제는 .NET null은 (는) SQL NULL과 다릅니다. SQL Null은 System.DBNull입니다. 따라서 .NET의 [null] 값입니다.

+0

그렇다면 아무것도 인쇄하지 않거나 가능한 경우 날짜를 인쇄하려면 어떻게해야합니까? – Dexter

+0

기술적으로 Frazell은 정확하지만 번역이 자동으로 이루어집니다. datetime 열이 null이면 .net null이 표시됩니다. 하지만 그게 문제가 아니에요, 당신은 그것이 null인지 확인하고 아무것도 인쇄하지 않는 코드를 작성해야합니다. 보시다시피, 이것을하기위한 가장 간단한 방법은?을 사용하는 것입니다. ASP.NET은이 작업을 수행하지 않습니다. –

1

가 보이는 당신이 날짜 시간에하는 방법 (dcdt.ToShortDateString())를 호출하려고처럼? 값이 없다 (실제로는 null이다). 이것을 시도하십시오 :

dcdt.HasValue ? dcdt.ToShortDateString() : String.Empty; 

EDIT (그냥 다시 읽어보십시오) : 또한 DateTime으로 변환하려고 시도하지 마십시오. nullable을 유지합니다.

편집 # 2 (의견에 따라) :

이 시도 :

DataTable dt  = ExecuteSomeQuery() ; 
object  value = dt.Rows[0]["nullable_datetime_column"] ; 
DateTime? instance = value != null && value is DateTime ? (DateTime?)value : (DateTime?)null) ; 

경우] :

if (dcdt.HasValue) 
{ userRow["DateCreated"] = dcdt.ToShortDateString(); } 
else 
{ userRow = DbNull.Value } 
+0

u.LastLogon.HasValue? u.LastLogon.Value.ToShortDateString() : DBNull.Value; 또는 u.LastLogon.HasValue? u.LastLogon.ToShortDateString() : DBNull.Value; 일을 거부한다. 그것은 그렇게 컴파일되지 않습니다. LastLogon은 일종의 DateTime입니까? – Dexter

+0

DBNull.Value가 문자열이 아니기 때문에 - 식은 일관된 데이터 형식을 반환해야합니다. 나는 적절하게 편집 할 것이다 –

+0

나는 그것을 해결했다고 생각한다. 나는 이것을 사용했다 : userRow [ "LastLogon"] = u.LastLogon.HasValue? u.LastLogon.Value.ToShortDateString() : String.Empty; – Dexter

1

당신은 당신의 데이터 접근 코드에 다음과 같은 것을 할 필요가 반환 된 열이 NULL이면 System.DBNull로 반환되고 그렇지 않으면 DateTime의 인스턴스 (또는 해당 매핑 된 유형이 — int, string 등)로 반환됩니다.결과적으로,이를 캐스팅하기 전에 조회에서 리턴 된 오브젝트 유형을 점검해야합니다.

+0

이미 DateTime입니까? 유형. 이제 DateTime 클래스의 ShortDateTimeString 함수를 사용하여 String으로 변환하려고합니다. 그것은 나를시키지 않을 것이다. – Dexter

+1

이 경우'string s = instance.HasValue? instance.Value.ToString() : "";은 트릭을 수행해야합니다. –

+0

맞습니다. 그러나 다른 누군가가 올바른 형식의 답을 구해줍니다. – Dexter

1

저는 덱스터가 어떻게해야하는지 물어 보았습니다. 글쎄, 확장 기능을 만들거야.

static class DateTimeExtensions 
{ 
    public static string ToString(this DateTime? dateTime, string format) 
    { 
     return dateTime.HasValue ? dateTime.Value.ToString(format) : String.Empty; 
    } 
} 

그리고 당신이 할 수 있습니다 : 객체가 null의 경우 내가 nullable 형식에 확장 메서드를 호출 할 수 있습니다

DateTime? dt = null; 
DateTime? dt2 = DateTime.Now; 
Console.WriteLine(dt.ToString("dd-MM-yy")); 
Console.WriteLine(dt2.ToString("dd-MM-yy")); 

참고.

+0

좋은 해결책입니다. –