Cómo leer las compensaciones de tiempo de Oracle usando Dapper

c# dapper oracle timezone

Pregunta

Tengo datos almacenados en una columna Oracle TIMESTAMP WITH TIME ZONE, y ahora estoy tratando de volver a leerlos en una variable C # DateTimeOffset usando Dapper. El problema es que Dapper ignora el valor de compensación en la base de datos y siempre rellena mi variable con el desplazamiento actual del entorno.

¿Hay alguna manera sencilla de que Dapper reconozca el valor de compensación de la base de datos?

Básicamente, quiero ver algo en esta línea de trabajo:

var input=new DateTimeOffset(2016, 3, 15, 14, 30, 0, TimeSpan.Zero);
DateTimeOffset output;
using(var connection=new OracleConnection(QueryConnectionString)) {
    output=connection.ExecuteScalar<DateTimeOffset>("Select to_timestamp_tz('"+input.ToString("yyyy-MM-dd HH:mm zzz")+"', 'YYYY-MM-DD HH24:MI TZH:TZM') From DUAL");
}
Assert.AreEqual(input, output);

Tal como está escrito esto da una excepción de conversión no válida, parece que dapper lo lee como un DateTime y luego intenta convertirlo a DateTimeOffset, ignorando el valor de compensación.

Mi código que consulta una tabla y rellena un objeto de clase definido con estos tipos no arroja un error, pero rellena la instancia del objeto con el desplazamiento local en lugar del valor en la base de datos. Así que terminaría con 2016-03-15 14:30 -5 lugar de 2016-03-15 14:30 +0 , si estuviera trabajando con el valor de entrada anterior.

Respuesta popular

Entonces noté que otras personas han estado viendo esta pregunta y aunque no tengo una respuesta directa, pensé que compartiría el trabajo que hemos estado usando ...

Descargo de responsabilidad: Esto es un poco complicado, y preferiría un enfoque más limpio, pero funciona.

Esencialmente, lo que terminamos haciendo fue convertir la columna Timestamp With Timezone en una cadena formateada en la instrucción select. En la clase C #, agregamos una propiedad que era una representación de cadena del DateTimeOffset, utilizando el mismo formato. Luego usamos alias en la consulta para asegurar que Dapper llenara el valor en la propiedad de la cadena, el colocador lo analiza de nuevo a DateTimeOffset y establece la propiedad original.



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é