我遇到了问题。我的代码使用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(),
};
如果closedDate
或effectiveDate
返回DBnull.Value
,我会
InvalidCastException未处理 - 指定的强制转换无效。
那么如何防止出现此错误?
答案 0 :(得分:5)
tldr; 问题有两方面:DataTable使用DBNull.Value
来表示“空”值,而DBNull.Value
或null
都不能投放到DateTime
。 < / p>
稍后添加了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
,而不可以投射到{{1} (更不用说DateTime?
)并导致所描述的错误。
以下是如何最低限度地重现此异常:
DateTime
但是,可以将object v = DBNull.Value;
DateTime dt = (DateTime)v;
转换为null
:
DateTime?
如果需要,然后将其合并到object v = null;
DateTime? maybeDt = (DateTime?)v;
:
DateTime
答案 1 :(得分:0)
更新:试试这个
public static class ConversionExtensions
{
public static string SafeDateTime(this object value)
{
if (value == DBNull.Value) return string.Empty;
var valueType = value.GetType();
if (typeof (DateTime?).IsAssignableFrom(valueType))
{
var nullableValue = value as DateTime?;
if (nullableValue == null) return string.Empty;
return nullableValue.Value.ToString();
}
if (typeof (DateTime).IsAssignableFrom(valueType))
{
return ((DateTime) value).ToString();
}
return string.Empty;
}
}
跟:
effectiveDate = row2["caseEffectiveDate"].SafeDateTime()