Roz*_*wel 5 c# oracle timezone dapper
我将数据存储在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);
Run Code Online (Sandbox Code Playgroud)
如此编写,这给出了无效的强制转换异常,看起来dapper将其作为DateTime读取,然后尝试将其强制转换为DateTimeOffset,忽略偏移值.
查询表并填充使用这些类型定义的类对象的代码不会引发错误,但它会使用本地偏移量而不是数据库中的值填充对象实例.所以如果我使用上面的输入值,我最终会用2016-03-15 14:30 -5而不是2016-03-15 14:30 +0.
所以我注意到其他一些人一直在关注这个问题,虽然我没有直接的答案,但我想我会分享我们一直在使用的工作......
免责声明:这有点混乱,我更喜欢更干净的方法,但它确实有效。
本质上,我们最终所做的是将 Timestamp With Timezone 列转换为 select 语句中的格式化字符串。然后,我们在 C# 类中添加了一个属性,该属性是 DateTimeOffset 的字符串表示形式,使用相同的格式。然后,我们在查询中使用别名来确保 Dapper 将值填充到字符串属性中,该属性的 setter 将其解析回 DateTimeOffset,并设置原始属性。
| 归档时间: |
|
| 查看次数: |
702 次 |
| 最近记录: |