2009-07-07 5 views
1

Hallo Ich versuche, eine Sammlung zurückzugeben, die möglicherweise null Datum Werte haben. Wenn sie jedoch null sind - ich möchte sie auf diese Weise behalten und nicht einfach ein beliebiges Datum verwenden.Umgang mit Null Daten von DB zurückgegeben

Wenn es sich um eine Zeichenfolge, würde ich für NULL-Werte überprüfen wie so:

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

Wie würde ich das gleiche tun für ein Datum? Folgendes wird nicht kompiliert (Es gibt keine implizite Konvertierung zwischen 'null' und System.DateTime ').

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

Mein dto ist eingerichtet, um mit Nullwerten umzugehen.

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

Alle Hinweise/Hilfe/Hinweise sehr geschätzt. dank

Antwort

8

Versuchen:

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

Das? Der Operator benötigt beide Operanden (null und dr.GetDateTime (9) in diesem Fall) vom gleichen Typ.

+0

Sie d Mann! Vielen Dank! – user17510

5

Der Bedingungsoperator nicht berücksichtigt, was das Ergebnis zuweisen, so dass Sie entweder der Operanden zu Datetime ?:

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

IsDBNull (int) in der Regel zu werfen haben, ist viel langsamer, dass wie unter Verwendung von Methoden GetSqlInt32 und dann zu DBNull.Value Vergleich oder seine eigene .IsNull Wie mit:

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

einigen Template-Lösungen versucht, aber ohne Erfolg so weit. Das Problem ist, dass alle Sql-Typen (SqlInt32 here) tatsächlich Strukturen sind und während sie alle .Value -Eigenschaft C# haben keine echten Vorlagen, um das zu handhaben. Außerdem haben sie ihre eigene INullable-Schnittstelle, die nur .IsNull hat und nicht kompatibel mit Nylable <> ist.

Ich vermute, dass man einen vollständigen Satz von SQL-Typen als C# -Templates oder ICOnvertible zu ihnen hinzufügen müsste, um nur ein oder zwei Template-Methoden zu haben.

Wenn jemand vielleicht eine Idee, mit einem funktionellen Trick hat oder zwei sprechen :-)

Verwandte Themen