gpt4 book ai didi

c# - 如何使用 Dapper 从 oracle 读取时间偏移量

转载 作者:太空狗 更新时间:2023-10-29 23:50:03 28 4
gpt4 key购买 nike

我将数据存储在 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,如果我使用上面的代码输入值。

最佳答案

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

免责声明:这有点麻烦,我更喜欢更简洁的方法,但它确实有效。

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

关于c# - 如何使用 Dapper 从 oracle 读取时间偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36021582/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com