У меня есть данные, хранящиеся в колонке 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
, если бы я работал с указанным выше значением ввода.
Я не уверен, что это проблема Dapper, а скорее связана с ODP.Net. Помогает ли [этот ответ] (http://stackoverflow.com/a/14140274/634824)? –
@Matt Не совсем. Если используется адаптер данных, он похоронен в реализации dapper. Я не смог найти доступ к настройкам, указанным в этом ответе. – Rozwel
Вы пытались преобразовать '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 ");' –