【问题标题】:How to read time offsets from oracle using Dapper如何使用 Dapper 从 oracle 读取时间偏移
【发布时间】: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&lt;DateTimeOffset&gt;("Select to_timestamp_tz('"+input.ToUniversalTime().ToString("yyyy-MM-dd HH:mm zzz")+"', 'YYYY-MM-DD HH24:MI TZH:TZM') From DUAL");
  • @Gleb 是的,在大多数情况下,我们只是将所有内容都存储为 UTC。但在某些情况下,操作的本地时间也很有价值。

标签: c# oracle timezone dapper


【解决方案1】:

所以我注意到其他一些人一直在研究这个问题,虽然我没有直接的答案,但我想我会分享我们一直在使用的解决方法......

免责声明:这有点杂乱无章,我更喜欢更干净的方法,但它确实有效。

我们最终所做的基本上是将 Timestamp With Timezone 列转换为 select 语句中的格式化字符串。然后,我们在 C# 类中添加了一个属性,该属性是 DateTimeOffset 的字符串表示形式,使用相同的格式。然后我们在查询中使用别名来确保 Dapper 将值填充到字符串属性中,其设置器将其解析回 DateTimeOffset,并设置原始属性。

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多