gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:21:03 24 4
gpt4 key购买 nike

我遇到了一个问题。这是我的代码使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com