2010-10-20 12 views
7

Widziałem wiele, wiele wersji tego na SO, ale żaden z nich nie wydaje się działać na moje potrzeby.Obsługa DateTime DBNull

Moje dane pochodzą z bazy danych dostawców, która dopuszcza wartość null dla pól DateTime. Najpierw wyciągam moje dane do DataTable.

using (SqlCommand cmd = new SqlCommand(sb.ToString(), conn)) 
using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
{ 
    da.Fill(dt); 
} 

Konwertuję DataTable na listę <> do przetworzenia.

var equipment = from i in dt.AsEnumerable() 
    select new Equipment() 
    { 
     Id = i.Field<string>("ID"), 
     BeginDate = i.Field<DateTime>("BeginDate"), 
     EndDate = i.Field<DateTime>("EndDate"), 
     EstimatedLife = i.Field<double>("EstimatedLife") 
    } 

Jak zatem sprawdzić DBNull w tym przypadku? Próbowałem napisać metodę.

public DateTime CheckDBNull(object dateTime) 
    { 
     if (dateTime == DBNull.Value) 
      return DateTime.MinValue; 
     else 
      return (DateTime)dateTime; 
    } 

Odpowiedz

7

Możliwym rozwiązaniem jest przechowywanie go jako wartości pustych czasie bieżąco z składni DateTime?

Oto link to the MSDN temat korzystania zerowalne typów

+0

Więc na mojego obiektu Equipment określić jako 'DateTime' pola' 'DateTime –

+0

Jeśli jest to ważna sprawa dla Twojego biznesu Sprzęt nie ma daty rozpoczęcia ani zakończenia, a następnie tak. W przeciwnym razie warstwa db powinna wygenerować wyjątek. –

+1

yep - jest to skrót do 'Nullable ' –

6

Zastosowanie IsDBNull()

System.Convert.IsDBNull(value); 

lub jeśli masz SqlDataReader

reader.IsDBNull(ordinal); 

i dokonać właściwości DateTime być pustych (DateTime?) i ustawić null w przypadku DBNull. Field<T>() zrobi to automatycznie.

0

tutaj jest przykładem pewnego kodu używam czytać Datetimes

im na pewno może to być napisany lepiej, ale działa dobrze dla mnie

public DateTime? ReadNullableDateTimefromReader(string field, IDataRecord data) 
    { 

     var a = data[field]; 
     if (a != DBNull.Value) 
     { 
      return Convert.ToDateTime(a); 
     } 
     return null; 
    } 

    public DateTime ReadDateTimefromReader(string field, IDataRecord data) 
    { 
     DateTime value; 
     var valueAsString = data[field].ToString(); 
     try 
     { 
      value = DateTime.Parse(valueAsString); 
     } 
     catch (Exception) 
     { 
      throw new Exception("Cannot read Datetime from reader"); 
     } 

     return value; 
    } 
0

należy użyć DataRow["ColumnName"] is DBNull, aby porównać wartość DateTime null.

Np .:

if(studentDataRow["JoinDate"] is DBNull) { // Do something here } 
1

I odkryli, że najprostszym sposobem obsługi to jest do oddania pola jako typ danych za pomocą słowa kluczowego „AS”. Działa to doskonale dla pól bazy danych, które mogą mieć wartość zerową i są ładne i proste.

Oto więcej szczegółów na ten temat: Direct casting vs 'as' operator?

Przykład:

IDataRecord record = FromSomeSqlQuerySource; 
    string nullableString; 
    DateTime? nullableDateTime; 

    nullableString = record["StringFromRecord"] as string; 
    nullableDateTime = record["DateTimeFromRecord"] as DateTime?; 
Powiązane problemy