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(),
                  };

closedDateまたはeffectiveDatereturnの場合DBnull.Value、私は得る

InvalidCastException が処理されませんでした - 指定されたキャストが無効です。

では、どうすればこのエラーを防ぐことができますか?

4

2 に答える 2

5

tldr; 問題は 2 つあります。DataTable はDBNull.Value"null" 値を表すために使用され、どちらにもキャストできないか、DBNull.ValueまたはnullにキャストできませんDateTime

拡張メソッドは後で追加され、Field<T>null 値を持つ DBNull および Nullable/参照型をより簡単に処理できるようになりました。また、厳密に型指定された署名の背後にある変換を隠します。これらのLINQ to DataSet拡張メソッドは、必要に応じて にマップする方法を知っていますDBNull.Valuenull

このため、 usingrow.Field<DateTime?>("caseEffectiveDate")は値を含む (クエリが値を返した場合) またはを返します。また、サーバーが互換性のない値を返した場合は例外をスローすることもありますが、決してを返しません。DateTime?nullDBNull.Value

ただし、標準は値 (またはその他の型)row["caseEffectiveDate"]を返すか、キャストできない( aははるかに少ない) ため、説明されているエラーが発生します。DateTimeDBValue.NullDateTime?DateTime

この例外を最小限に再現する方法は次のとおりです。

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

nullただし、 aを 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 に答える