1

我有问题。这是我的代码使用 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 - 指定的强制转换无效。

那么如何防止这个错误呢?

4

2 回答 2

5

tldr; 问题有两个方面:DataTable 用于DBNull.Value表示“空”值,并且既不DBNull.Valuenull不可转换为DateTime.

Field<T>后来添加了扩展方法,使处理具有空值的 DBNull 和 Nullable/引用类型更加容易;它还将转换隐藏在强类型签名后面。这些LINQ to DataSet扩展方法知道如何适当地映射DBNull.Valuenull

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

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

以下是最小化重现此异常的方法:

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

但是,可以将 a 转换null为 a DateTime?

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

然后在需要时将其合并为微不足道的DateTime

object v = null;
DateTime? dt = (DateTime?)v ?? DateTime.MinValue;
于 2012-11-27T22:28:33.700 回答
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()
于 2012-11-25T05:50:49.503 回答