Mam dane przechowywane w wyroczni TIMESTAMP Z STREFĄ STREFY CZASOWEJ i próbuję teraz odczytać ją z powrotem w zmiennej C# DateTimeOffset przy użyciu Dappera. Problem polega na tym, że dapper ignoruje wartość przesunięcia w bazie danych i zawsze wypełnia moją zmienną bieżącym offsetem środowiska.Jak odczytać przesunięcia czasowe z wyroczni za pomocą Dappera
Czy istnieje prosty sposób na uzyskanie wyrafinowanej wartości z bazy danych?
Zasadniczo chcę zobaczyć coś w tym kierunku działać:
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);
Jak napisano daje wyjątek niepoprawnego rzutowania, wydaje się, że elegancki odczytuje go jako DateTime, a następnie próbuje rzucić go do datetimeoffset, ignorując wartość przesunięcia.
Mój kod, który zapytuje tabelę i wypełnia obiekt klasy zdefiniowany za pomocą tych typów, nie generuje błędu, ale wypełnia instancję obiektu lokalnym odsunięciem, a nie wartością w bazie danych. Tak więc skończyłbym z 2016-03-15 14:30 -5
zamiast 2016-03-15 14:30 +0
, gdybym pracował z powyższą wartością wejściową.
Nie jestem pewien, czy jest to kwestia Dapper, ale raczej związana z ODP.Net. Czy [ta odpowiedź] (http://stackoverflow.com/a/14140274/634824) pomaga? –
@Matt Nie bardzo. Jeśli używany jest adapter danych, jest on pochowany w bardziej zaawansowanej implementacji. Nie byłem w stanie znaleźć żadnego dostępu do ustawienia, o którym mowa w tej odpowiedzi. – Rozwel
Czy próbowałeś przekonwertować 'DateTimeOffset' na utc? 'output = connection.ExecuteScalar (" Wybierz to_timestamp_tz ("" + input.ToUniversalTime(). ToString ("rrrr-MM-dd HH: mm zzz") + "", "YYYY-MM-DD HH24: MI TZH: TZM ") od DUAL"); ' –