【发布时间】:2016-07-01 12:01:16
【问题描述】:
我将数据存储在 oracle TIMESTAMP WITH TIME ZONE 列中,我现在正尝试使用 Dapper 将其读回 C# DateTimeOffset 变量。问题是 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);
正如所写,这给出了一个无效的转换异常,看起来 dapper 将其读取为 DateTime,然后尝试将其转换为 DateTimeOffset,忽略偏移值。
查询表并填充使用这些类型定义的类对象的代码不会引发错误,但它会使用本地偏移量而不是数据库中的值填充对象实例。因此,如果我使用上述输入值,我最终会得到 2016-03-15 14:30 -5 而不是 2016-03-15 14:30 +0。
【问题讨论】:
-
我不确定这是一个 Dapper 问题,而是与 ODP.Net 有关。 this answer 有帮助吗?
-
@Matt 不是。如果正在使用数据适配器,它会被隐藏在 dapper 实现中。我无法找到对该答案中提到的设置的任何访问权限。
-
您是否尝试将
DateTimeOffset转换为UTC?output=connection.ExecuteScalar<DateTimeOffset>("Select to_timestamp_tz('"+input.ToUniversalTime().ToString("yyyy-MM-dd HH:mm zzz")+"', 'YYYY-MM-DD HH24:MI TZH:TZM') From DUAL"); -
@Gleb 是的,在大多数情况下,我们只是将所有内容都存储为 UTC。但在某些情况下,操作的本地时间也很有价值。