我遇到问题了。我的代码使用 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(),
};
If closedDate
or effectiveDate
return DBnull.Value
, I get
InvalidCastException 未处理 - 指定的强制转换无效。
那么我该如何防止这个错误呢?
tldr; 问题有两个:DataTable 使用DBNull.Value
代表“空”值,并且两者都不是DBNull.Value
or null
可以铸造成DateTime
.
The Field<T>后来添加了扩展方法,以便更轻松地处理具有 null 值的 DBNull 和 Nullable/引用类型;它还将转换隐藏在强类型签名后面。这些LINQ 到数据集扩展方法知道如何绘制地图DBNull.Value to null作为适当的.
由于这个使用row.Field<DateTime?>("caseEffectiveDate")
将返回either the DateTime?
带有一个值(如果查询返回一个值)或null
,如果服务器返回不兼容的值,它也可能抛出异常 - 但它会never return DBNull.Value
.
然而,标准row["caseEffectiveDate"]
将返回一个DateTime
值(或其他类型)或DBValue.Null
这是not可投射到DateTime?
(更不用说一个DateTime
)并导致所描述的错误。
以下是如何最小化重现此异常:
object v = DBNull.Value;
DateTime dt = (DateTime)v;
不过,转换一个就好了null
to a DateTime?
:
object v = null;
DateTime? maybeDt = (DateTime?)v;
然后将其合并到DateTime
如果需要的话:
object v = null;
DateTime? dt = (DateTime?)v ?? DateTime.MinValue;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)