2016-03-15 2 views
5

У меня есть данные, хранящиеся в колонке TIMECAMP WITH TIME ZONE oracle, и теперь я пытаюсь прочитать ее обратно в переменную C# DateTimeOffset, используя Dapper. Проблема в том, что dapper игнорирует значение смещения в базе данных и всегда заполняет мою переменную текущим смещением среды.Как читать временные смещения от oracle с помощью Dapper

Есть ли простой способ заставить dapper распознавать значение смещения из базы данных?

В основном я хочу, чтобы увидеть что-то вдоль этих линий работают:

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); 

Как написано это дает недопустимое исключение броска, кажется, что щеголеватый читает его как DateTime и затем пытается привести его к DateTimeOffset, не обращая внимания значение смещения.

Мой код, который запрашивает таблицу и заполняет объект класса, определенный этими типами, не выдает ошибку, но заполняет экземпляр объекта локальным смещением, а не значением в базе данных. Таким образом, я бы получил 2016-03-15 14:30 -5 вместо 2016-03-15 14:30 +0, если бы я работал с указанным выше значением ввода.

+0

Я не уверен, что это проблема Dapper, а скорее связана с ODP.Net. Помогает ли [этот ответ] (http://stackoverflow.com/a/14140274/634824)? –

+0

@Matt Не совсем. Если используется адаптер данных, он похоронен в реализации dapper. Я не смог найти доступ к настройкам, указанным в этом ответе. – Rozwel

+0

Вы пытались преобразовать 'DateTimeOffset' в utc? 'output = connection.ExecuteScalar (" Выберите to_timestamp_tz ('"+ input.ToUniversalTime(). ToString (" yyyy-MM-dd HH: mm zzz ") +"', 'YYYY-MM-DD HH24: MI TZH: TZM ') From DUAL ");' –

ответ

0

Так что я заметил, что некоторые другие люди смотрели на этот вопрос, и в то время как у меня нет прямого ответа, я думал, что я разделю работу вокруг этого мы использовали ...

Отказ от ответственности: Это немного клочья, и я бы предпочел более чистый подход, но он работает.

По существу, мы закончили работу с преобразованием столбца Timestamp With Timezone в форматированную строку в инструкции select. В классе C# мы добавили свойство, которое было строковым представлением DateTimeOffset, используя тот же формат. Затем мы использовали псевдонимы в запросе, чтобы гарантировать, что Dapper занесло значение в свойство строки, средство настройки которого отбирает его обратно в DateTimeOffset и устанавливает исходное свойство.