"指定的演员表无效"在DateQ字段为空时在LINQ中

时间:2012-11-25 05:47:23

标签: 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未处理 - 指定的强制转换无效。

那么如何防止出现此错误?

2 个答案:

答案 0 :(得分:5)

tldr; 问题有两方面:DataTable使用DBNull.Value来表示“空”值,而DBNull.Valuenull都不能投放到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()