可能重复:
处理 DBNull 的最佳方法是什么
.NET 中设置具有 DBNull 值的变量(也就是返回的 SQL 空值)的最有效语法是什么?我记得读过一些被放入 .NET 3.0 的东西。让我们假设我设置的变量具有 DateTime 类型。
常见错误:
从类型“DBNull”到类型“Date”的转换无效。
可能重复:
处理 DBNull 的最佳方法是什么
.NET 中设置具有 DBNull 值的变量(也就是返回的 SQL 空值)的最有效语法是什么?我记得读过一些被放入 .NET 3.0 的东西。让我们假设我设置的变量具有 DateTime 类型。
常见错误:
从类型“DBNull”到类型“Date”的转换无效。
DateTime 是一个值类型,并且只能包含有效的日期/时间。通常,处理这种情况的方法是检查从数据库返回的值,看它是否为 DBNull.Value,如果是,请将 DateTime 设置为一个特殊值,如代表 Null 的 DateTime.MinValue。
或者,您可以使用 DateTime? 这是一个可为空的 DateTime 数据类型,您实际上可以将其分配为 null(常规的 .Net null,而不是 DBNull)。
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");
我通常通过将我的类中的属性设置为 NULLABLE 类型来解决这个问题。这与 bool 类型特别相关,因为默认情况下,它没有值(既不是真也不是假)。
public class MyDbTable
{
public int MyId { get; set; }
public DateTime? Date { get; set; }
public bool? IsDirty { get; set; }
}