重複の可能性:
DBNull を処理する最善の方法は何ですか?
DBNull の値を持つ変数を設定するための .NET で最も効率的な構文は何ですか (別名 SQL null 値が返されます)? この種のことのために.NET 3.0に組み込まれたものを読んだことを覚えています。設定している変数の型が DateTime であると仮定しましょう。
一般的なエラー:
タイプ 'DBNull' からタイプ 'Date' への変換は無効です。
重複の可能性:
DBNull を処理する最善の方法は何ですか?
DBNull の値を持つ変数を設定するための .NET で最も効率的な構文は何ですか (別名 SQL null 値が返されます)? この種のことのために.NET 3.0に組み込まれたものを読んだことを覚えています。設定している変数の型が DateTime であると仮定しましょう。
一般的なエラー:
タイプ 'DBNull' からタイプ 'Date' への変換は無効です。
DateTimeは値型であり、有効な日時のみを含めることができます。通常、これを処理する方法は、データベースから返された値をチェックして、それがDBNull.Valueであるかどうかを確認し、そうである場合は、DateTimeをNullを表すDateTime.MinValueなどの特別な値に設定します。
または、DateTimeを使用できますか?これはnull許容のDateTimeデータ型であり、実際にnullを割り当てることができます(DBNullではなく通常の.Net null)。
DateTime foo;
if (row["SomeField"] == DBNull.Value) {
foo = DateTime.MinValue;
} else {
foo = (DateTime)row["SomeField"];
}
次のようにDataRowに拡張メソッドを作成することで、この構文を少し良くすることができます。
public static void ToDateTime(this DataRow row, string columnName) {
if (row[columnName] == DBNull.Value) {
return DateTime.MinValue;
} else {
return (DateTime)row[columnName];
}
}
次に、元のコードを次のように書き直すことができます。
DateTime foo = row.ToDateTime("SomeField");
私は通常、クラスのプロパティをNULL可能型にすることでこれを回避します。デフォルトでは値がない(trueでもfalseでもない)ため、これは特にブール型に関連します。
public class MyDbTable
{
public int MyId { get; set; }
public DateTime? Date { get; set; }
public bool? IsDirty { get; set; }
}