2016-03-15 11 views
5

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ą.

+0

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

+0

@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

+0

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

Odpowiedz

0

Tak zauważyłem, że kilka innych osób zostało patrząc na to pytanie, a ja nie mam bezpośredniej odpowiedzi, myślałem, że chciałbym podzielić się obejść, że używamy ...

Oświadczenie: To trochę kłopotliwe, a ja wolałbym czystsze podejście, ale działa.

Zasadniczo wykonaliśmy konwersję znacznika czasu z kolumną strefy czasowej na sformatowany ciąg w instrukcji select. W klasie C# dodaliśmy właściwość, która była reprezentacją ciągów DateTimeOffset, przy użyciu tego samego formatu. Następnie użyliśmy aliasów w zapytaniu, aby upewnić się, że Dapper wypełniło wartość we właściwości string, której setter przetworzy ją ponownie na DateTimeOffset i ustawi oryginalną właściwość.

Powiązane problemy