我将数据存储在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
。
答案 0 :(得分:0)
所以我注意到其他一些人一直在关注这个问题而我没有直接答案,我想我会分享我们一直在使用的工作......
免责声明:这有点像kludge,我更喜欢更清洁的方法,但它有效。
基本上我们最终做的是将Timestamp With Timezone列转换为select语句中的格式化字符串。在C#类中,我们使用相同的格式添加了一个属性,该属性是DateTimeOffset的字符串表示形式。然后我们在查询中使用别名来确保Dapper将值填充到string属性中,setter将其解析回DateTimeOffset,并设置原始属性。