2016-03-15 30 views
5

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.

+0

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? –

+0

@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

+0

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 ");' –

risposta

0

Così ho notato che alcune altre persone sono stati a guardare questa domanda e, mentre io non ho una risposta diretta, ho pensato di condividere il lavoro in giro che abbiamo usato ...

di responsabilità: Questo è un po 'scomodo, e preferirei un approccio più pulito, ma funziona.

In sostanza, ciò che abbiamo finito è stato convertire la colonna Timestamp With Timezone in una stringa formattata nell'istruzione select. Nella classe C# abbiamo poi aggiunto una proprietà che era una rappresentazione di stringa di DateTimeOffset, usando lo stesso formato. Abbiamo quindi utilizzato alias nella query per garantire che Dapper abbia inserito il valore nella proprietà stringa, il setter di cui lo analizza in un DateTimeOffset e imposta la proprietà originale.