【问题标题】:"Input string was not in a correct format" when using LINQ使用 LINQ 时“输入字符串的格式不正确”
【发布时间】:2012-05-12 22:10:57
【问题描述】:

我正在尝试对对象集进行FirstOrDefault() 查询,并引发了一个奇怪的异常:

我的代码:

private RecordObject GetRecordByID(int recID)
{
    return _objectSet.FirstOrDefault(rec => rec.ID == recID);
}

异常消息:

输入的字符串格式不正确

InnerException 为空。

堆栈跟踪:

at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer&         number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.Convert.ToDecimal(String value, IFormatProvider provider)
at System.String.System.IConvertible.ToDecimal(IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at Oracle.DataAccess.Client.OracleDataReader.ChangeType(Object sourceValue, Type targetType)
at Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i)
at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
at System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at System.Linq.SystemCore_EnumerableDebugView`1.get_Items()

奇怪的是我没有进行任何类型转换。

P.S:数据库是Oracle 10g,但由于我使用的是EF,我想这并不重要,但以防万一你需要这个细节。

【问题讨论】:

  • 仅执行 FirstOrDefault() 是否返回值?
  • 你能在db表中写下你的id是什么格式吗?
  • 我今天遇到了完全相同的错误,问题是我将数据作为整数插入,而在数据库字段中是 char。

标签: c# linq type-conversion


【解决方案1】:

好的,我已经解决了这个问题,我会保留这个问题,以防有人遇到同样的问题。

为了解决这个问题,我需要从数据库中重新导入我的表,显然,我的 ADO.Net 对象和数据库之间存在一些不兼容的列。

我认为,EF 试图进行 Cast 操作来弥补我的错误(留下不兼容的版本),并且无法进行强制转换,这就是类型转换的来源。

谢谢大家。

【讨论】:

    【解决方案2】:

    检查您是否没有将 int 与数据库 (ID) 中的空列进行比较。

    附:传递的 recId 不为空,但它所检查的值在数据库表中可能为空

    【讨论】:

    • recID在方法中是int类型,也是编译时错误
    • 不,没有编译时错误,因为我提供了堆栈跟踪,这意味着它是一个运行时错误。
    • 我的意思是检查映射的实体列(在这种情况下为Id)是否未定义为空列(列允许数据库中的空值)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多