我有一个映射到Oracle中的表的POCO。列SOU_SEQ
的类型为NUMBER(10,0)
,POCO表示此列为long
。
问题是当我尝试使用Dapper对该表运行查询时出现以下错误:
System.Data.DataException:解析第8列时出错(SOU_SEQ = 09/07/2009) 00:00:00 - 日期时间) ---> System.OutOfMemoryException:异常 类型'System.OutOfMemoryException'被抛出。
at System.Convert.ChangeType(Object value,Type conversionType, IFormatProvider提供者)在Devart.Data.Oracle.ad.d(Byte [] A_0, Int32 A_1,Int32 A_2)at Devart.Data.Oracle.OracleDataReader.b(Int32 A_0)at Devart.Data.Oracle.OracleDataReader.GetValue(Int32 i)at Devart.Common.DbDataReaderBase.get_Item(Int32 ordinal)at Deserialize3c89d5be-c520-433f-a74f-f2e0bad095da(IDataReader)
---内部异常堆栈跟踪结束--- at Dapper.SqlMapper.ThrowDataException(Exception ex,Int32 index, D:\ Dev \ dapper-dot-net \ Dapper中的IDataReader reader,Object value) NET40 \ SqlMapper.cs:第4153行 Deserialize3c89d5be-c520-433f-a74f-f2e0bad095da(IDataReader)at at Dapper.SqlMapper.d__147`1.MoveNext()in D:\ Dev \ dapper-dot-net \ Dapper NET45 \ SqlMapperAsync.cs:第112行
似乎Dapper试图将此列错误地解析为DateTime。
我用来查询数据库的代码如下:
await connnection.QueryAsync<T>(@sql, token).ConfigureAwait(false);
T
的定义会填满几个屏幕。但是,属性SOU_SEQ
的实现方式如下:
public class MappingClass
{
[System.ComponentModel.DataAnnotations.Key]
[System.ComponentModel.DataAnnotations.Required()]
[System.ComponentModel.DataAnnotations.Schema.Column(Order = 8)]
[System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)]
public virtual long SOU_SEQ
{
get;
set;
}
}
使用的SQL是SELECT * FROM SCHEMA.TABLE
*。
此问题是否有解决方法?
*使用*
的原因是我们确实需要所有列,因为这是在Oracle和SQL Server数据库之间复制的应用程序的一部分(第三方数据库中没有主键我们需要复制)。
答案 0 :(得分:1)
看起来,它不是Dapper的问题,而是由于在解析相关列时最有可能发生的OutOfMemoryException
。有问题的表是我们必须处理的最大的表,日志显示查询在异常发生之前运行了相当长的一段时间。
因此,我将添加一个试验性的答案,即解析错误的消息不是问题,而是解析期间存在与Dapper无关的内存问题。