如何使用Dapper

时间:2016-03-15 20:35:53

标签: 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);

如上所述,这会产生无效的强制转换异常,看起来dapper将其作为DateTime读取,然后尝试将其强制转换为DateTimeOffset,忽略偏移值。

我查询表并填充使用这些类型定义的类对象的代码不会引发错误,但它会使用本地偏移量而不是数据库中的值填充对象实例。因此,如果我使用上述输入值,我最终会使用2016-03-15 14:30 -5而不是2016-03-15 14:30 +0

1 个答案:

答案 0 :(得分:0)

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

免责声明:这有点像kludge,我更喜欢更清洁的方法,但它有效。

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