0

次のように、sqlDataReaderを介してデータベースからの結果をオブジェクトに入力しています。

foreach (DataRow dr in dt.Rows)
{
  wt = new WorkTasksDto
  {
    CompletedBy = dr.IsNull("CompletedBy") ? (DateTime?)null : (DateTime?)dr["CompletedBy"]
  };
}

ご覧のとおり、DbNUllをチェックしていますが、日付フィールドのレコードの1つが空白です。nullではなく、空のvarcharフィールドと同じように、DateTimeキャストを実行しようとすると、無効なキャストエラーが発生します。

空白のフィールドとDbNullフィールドを確認するにはどうすればよいですか?

4

3 に答える 3

1

あまりきれいではありませんが、これはうまくいくようです。

foreach (DataRow dr in dt.Rows)                  
{                       
     DateTime myDate;
     if(dr.IsNull("CompletedBy")) 
         myDate = DateTime.MinValue;
     else
     {
         if(DateTime.TryParse(dr["CompletedBy"].ToString(), out myDate) == false)
             myDate = DateTime.MinValue;
     }
     wt = new WorkTasksDto                              
     {                                  
         CompletedBy = (myDate == DateTime.MinValue ? null : myDate);
     };         
} 
于 2012-05-29T15:56:21.093 に答える
1

列タイプがDateTime値である場合、「空白」にすることはできません。列の型がstringの場合は、null と空白をチェックし、キャストではなく値を解析する必要があります。

CompletedBy = dr["CompletedBy"] == null || dr["CompletedBy"] == "" ?
              null : 
              DateTime.Parse(dr["CompletedBy"], CultureInfo.InvariantCulture);

代わりにDateTime使用するために解析できない空白以外の値があることがわかっている場合TryParse

列の型がobjectで、異なる型を混在させる場合は、最初に型を確認してからキャストする必要があります。

CompletedBy = dr["CompletedBy"] != null && dr["CompletedBy"] is DateTime ?
              (DateTime)dr["CompletedBy"] : 
              null;
于 2012-05-29T16:01:25.660 に答える
0

http://msdn.microsoft.com/en-us/library/system.datetime.tryparse.aspxを使用DateTime.TryParse()

DateTime completedDate;

DateTime.TryParse(reader["CompletedDate"].ToString(), out completedDate);

if(completedDate == DateTime.MinValue)
{

}
于 2012-05-29T15:45:38.207 に答える