2016-09-16 4 views
1

У меня есть POCO, который сопоставляется с таблицей в Oracle. Столбец SOU_SEQ имеет тип NUMBER(10,0) и POCO, который представляет этот столбец как long.Darser Parsing Number as Date

Проблема заключается в том, когда я пытаюсь запустить запрос к этой таблице с Dapper и я получаю следующее сообщение об ошибке:

System.Data.DataException: Error parsing column 8 (SOU_SEQ=09/07/2009 00:00:00 - DateTime) ---> System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.

at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) at 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)

--- End of inner exception stack trace --- at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value) in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 4153 at Deserialize3c89d5be-c520-433f-a74f-f2e0bad095da(IDataReader) at Dapper.SqlMapper.d__147`1.MoveNext() in D:\Dev\dapper-dot-net\Dapper NET45\SqlMapperAsync.cs:line 112

Вероятно, Щеголеватый пытается разобрать этот столбец неправильно как 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 (нет никаких первичных ключей в базе 3-й партии мы необходимо повторить).

+1

Можете ли вы добавить определение 'T',' @ sql' и соответствующего SQL DDL к вашему вопросу? –

+0

Теперь я добавил немного более подробную информацию. –

+1

Несколько советов: http://stackoverflow.com/q/10000203/173225, вы пытались воспроизвести с меньшим POCO и, возможно, явно называть столбцы? например 'SELECT SOU_SEQ FROM ... WHERE ...' и посмотреть, все еще проблема? Ответ ODP.Net может быть ответом. –

ответ

0

Похоже, что это не проблема с Dapper, это связано с OutOfMemoryException, которое, скорее всего, произошло при разборе рассматриваемого столбца. Таблица, о которой идет речь, является самой большой, с которой нам приходится иметь дело, и журналы показывают, что запрос выполнялся в течение значительного периода времени до возникновения исключения.

Итак, я собираюсь добавить в качестве предварительного ответа, что сообщение об ошибке синтаксического анализа не является проблемой, но, скорее, во время разбора была проблема с памятью, которая не связана с Dapper.