Convierta correctamente la propiedad DateTime con Dapper en SQLite

dapper datetime sqlite3

Pregunta

Estoy usando Dapper para insertar y obtener objetos a / desde SQLite: un objeto tiene una propiedad de tipo DateTime (y DateTimeOffset) que tengo que persistir y recuperar con precisión de milisegundos. No puedo encontrar una manera de recuperar correctamente el valor porque Dapper falla con:

    System.FormatException : String was not recognized as a valid DateTime.
   in System.DateTimeParse.ParseExactMultiple(String s, String[] formats, DateTimeFormatInfo dtfi, DateTimeStyles style)
   in System.DateTime.ParseExact(String s, String[] formats, IFormatProvider provider, DateTimeStyles style)
   in System.Data.SQLite.SQLiteConvert.ToDateTime(String dateText, SQLiteDateFormats format, DateTimeKind kind, String formatString)
   in System.Data.SQLite.SQLite3.GetDateTime(SQLiteStatement stmt, Int32 index)
   in System.Data.SQLite.SQLite3.GetValue(SQLiteStatement stmt, SQLiteConnectionFlags flags, Int32 index, SQLiteType typ)
   in System.Data.SQLite.SQLiteDataReader.GetValue(Int32 i)
   in System.Data.SQLite.SQLiteDataReader.GetValues(Object[] values)
   in Dapper.SqlMapper.<>c__DisplayClass5d.<GetDapperRowDeserializer>b__5c(IDataReader r) in SqlMapper.cs: line 2587
   in Dapper.SqlMapper.<QueryImpl>d__11`1.MoveNext() in SqlMapper.cs: line 1572
   in System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   in System.Linq.Enumerable.ToList(IEnumerable`1 source)
   in Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in SqlMapper.cs: line 1443
   in Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in SqlMapper.cs: line 1382

¿Qué debo probar? La columna es del tipo DATETIME.

¿Tengo que crear un TypeHandler personalizado y convertir DateTime a y desde una cadena SQLite en formato "o"?

Dapper versión 1.38

Respuesta popular

Descubrí que el TypeHandler personalizado para los tipos base no se puede usar debido a la selección de tipoMap que se elige antes de buscar TypeHandler.

He abierto un problema con dapper-dot-net, pero mientras tanto he resuelto reemplazar por reflexión el tipoMap por defecto con uno nuevo como el anterior menos las cuatro teclas DateTime, DateTime ?, DateTimeOffset, DateTimeOffset?



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué