I dati sono memorizzati in una colonna ORARIO TIMESTAMP CON FUSO ORARIO, e ora sto cercando di rileggerlo in una variabile C# DateTimeOffset usando Dapper. Il problema è che dapper ignora il valore di offset nel database e popola sempre la mia variabile con l'offset corrente dell'ambiente.Come leggere le correzioni dell'orario da oracle utilizzando Dapper
C'è un modo semplice per ottenere dapper riconoscere il valore di offset dal database?
Fondamentalmente voglio vedere qualcosa in questo senso lavorare:
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);
Come scritto questo dà un'eccezione getto non valido, sembra che azzimato legge come un DateTime e poi cerca di gettarlo ai DateTimeOffset, ignorando il valore di offset.
Il mio codice che richiede una tabella e popola un oggetto classe definito con questi tipi non genera un errore, ma popola l'istanza dell'oggetto con l'offset locale anziché il valore nel database. Quindi finirei con 2016-03-15 14:30 -5
invece di 2016-03-15 14:30 +0
, se lavorassi con il valore di input sopra riportato.
Non sono sicuro che si tratti di un problema di Dapper, ma piuttosto relativo a ODP.Net. [Questa risposta] (http://stackoverflow.com/a/14140274/634824) aiuta? –
@Matt Non proprio. Se viene utilizzato un adattatore dati, è sepolto nell'implementazione dapper. Non sono stato in grado di trovare alcun accesso alle impostazioni indicate in quella risposta. – Rozwel
hai provato a convertire 'DateTimeOffset' in utc? 'output = connection.ExecuteScalar (" Seleziona to_timestamp_tz ('"+ input.ToUniversalTime(). ToString (" aaaa-MM-gg HH: mm zzz ") +"', 'AAAA-MM-GG HH24: MI TZH: TZM ') Da DUAL ");' –