2011-11-08 13 views
8

DateTime.TryParseメソッドでは、DateTimeではなくDateTimeが引数として使用されますか? ?SqlDataReaderからNullable <DateTime>を解析する方法

if(!DateTime.TryParse(reader["Placed"].ToString(), out _placed)){ 
    throw new Exception("Order's placed datetime could not be parsed."); 
} 

Nullable<DateTime> _placed = null; 

それを回避する方法は何種類

の_placedです:

は今の私は、次のコードを持っていますか?

+0

になっています'Placed'カラムは実際にdbの文字列ですか?そうでなければ何ですか? – LukeH

+0

いいえ、配置されたDateTimeフィールドです。読者の["Placed"]戻り値を直接使用するべきですか? – lowerkey

+0

はい。それを行う方法については、ディランの答えを参照してください。 – LukeH

答えて

19

方法。

+8

+1。あるいは、 '_placed'をどちらの場合でも割り当てなければならない場合、' _placed = reader.IsDBNull(x)? (DateTime?)null:reader.GetDateTime(x); ' – LukeH

0

これは正常です。解析が失敗した場合、out引数は設定されません。したがって、wargumentの型がNullableであれば、それは還元された情報でした。値が前にそれから日付を解析しようとnullの場合

int x = reader.GetOrdinal("Placed"); 

if(!reader.IsDBNull(x)) 
    _placed = reader.GetDateTime(x); 
1
DateTime? _placed = null; 
DateTime d2; 
bool isDate = DateTime.TryParse(reader["Placed"].ToString(), out d2); 
if (isDate) _placed = d2; 
1

を決定するために、読者のIsDBNullメソッドを使用します。代わりにこの程度

6

トップアンサーとトップコメントのちょうど組み合わせ。 @ Dylan-Meadorと@LukeHに感謝します。
:ここ

int x = reader.GetOrdinal("Placed"); 
DateTime? _placed = reader.IsDBNull(x) ? (DateTime?)null : reader.GetDateTime(x); 
+2

この年齢では、ADOにはnullable DateTimeヘルパーが組み込まれていないのは残念です。 – yzorg

2

を(エド注意。ロングテールのために私は、このバージョンは、人間に多くの時間を節約すると思います)そして@yzorgの答えは、再利用可能な拡張メソッド

public static class SqlDataReaderExtensions 
{ 
    public static DateTime? GetNullableDateTime(this SqlDataReader reader, string fieldName) 
    { 
     int x = reader.GetOrdinal(fieldName); 
     return reader.IsDBNull(x) ? (DateTime?) null : reader.GetDateTime(x); 
    } 
} 
関連する問題