精致的解析数字作为日期

时间:2016-09-16 14:29:43

标签: c# oracle dapper

我有一个映射到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数据库之间复制的应用程序的一部分(第三方数据库中没有主键我们需要复制)。

1 个答案:

答案 0 :(得分:1)

看起来,它不是Dapper的问题,而是由于在解析相关列时最有可能发生的OutOfMemoryException。有问题的表是我们必须处理的最大的表,日志显示查询在异常发生之前运行了相当长的一段时间。

因此,我将添加一个试验性的答案,即解析错误的消息不是问题,而是解析期间存在与Dapper无关的内存问题。