c# - 当 DateTime 字段为 null 时 LINQ 中的 "Specified cast is not valid"

标签 c# exception datetime

我遇到了一个问题。这是我的代码使用 LINQ。

var resultCases = from row2 in dtCases.AsEnumerable()
                  where row2.Field<int>("caseID") == caseID2
                  select new
                  {
                              caseName = row2["caseName"].ToString(),
                              caseCourtPlace = row2["caseCourtPlace"].ToString(),
                              caseCourtRef = row2["caseCourtRef"].ToString(),
                              caseOfficeRef = row2["caseOfficeRef"].ToString(),
                              effectiveDate = ((DateTime)row2["caseEffectiveDate"]),
                              closedDate = ((DateTime)row2["caseClosedDate"]),
                              caseFolderPath = row2["casesFolderPath"].ToString(),
                              category = row2["categoryName"].ToString(),
                              department = row2["departmentName"].ToString(),
                              empName = row2["empName"].ToString(),
                              judgeName = row2["judgeName"].ToString(),
                              asName = row2["asCasesName"].ToString(),
                  };

如果 closedDateeffectiveDate 返回 DBnull.Value,我得到

InvalidCastException was unhandled - Specified cast is not valid.

那么我怎样才能避免这个错误呢?

最佳答案

tldr; 问题有两个方面:DataTable 使用 DBNull.Value表示“空”值,既不 DBNull.Valuenull可浇注到 DateTime .

Field<T> 后来添加了扩展方法,使处理具有空值的 DBNull 和 Nullable/引用类型变得更加容易;它还隐藏了强类型签名背后的转换。这些LINQ to DataSet扩展方法knows how to map DBNull.Value to null as appropriate .

因此使用 row.Field<DateTime?>("caseEffectiveDate")将返回 任一个 DateTime?带有一个值(如果查询返回一个值)或 null ,如果服务器返回不兼容的值,它也可能抛出异常 - 但它永远不会返回 DBNull.Value .

但是,标准row["caseEffectiveDate"]将返回 DateTime值(或其他类型)或 DBValue.Null不能转换为DateTime? (更不用说 DateTime )并导致所描述的错误。

以下是如何最小化重现此异常:

object v = DBNull.Value;
DateTime dt = (DateTime)v;

但是,转换 null 没问题到 DateTime? :

object v = null;
DateTime? maybeDt = (DateTime?)v;

然后很容易将其合并为 DateTime如果需要:

object v = null;
DateTime? dt = (DateTime?)v ?? DateTime.MinValue;

关于c# - 当 DateTime 字段为 null 时 LINQ 中的 "Specified cast is not valid",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13548676/

相关文章:

c# - 在可移植类库中实现自定义异常

mysql - 从日期字段mysql中提取年和月

javascript - 如何使用 Date() 对象设置特定区域时区以正确计算两个事件之间的时间

c# - 在 C# 中除以 2 个 longs 时得到 0 的值

c# - 使用 SubSonic 寻呼

ios - 是否有使用 crashlytics 从 ios 发送非致命崩溃的解决方案?

delphi - 如何获取导致 TDBGridInplaceEdit 错误的值?

javascript - Momentjs 中的 FireFox 日期无效

c# - 什么是最高效的,为什么?

c# - Paypal 沙箱无法识别新返回的 ProfileID(错误 11546)