c# - 通过 Dapper 在查询中传递 UTC 日期
问题描述
我在这里为自己(如果没有其他人)发布答案,因为我从未发现它在 SO 的其他地方明显列出。为此浪费了几个小时。
我想通过以下方式使用 Dapper:
await dapper.Connection().QueryAsync<T>(insertSQL, obj);
insertSQL
例如,可以是将日期字段添加到表记录中的插入语句。该obj
对象提供这些字段的值作为参数。
如果日期需要是 UTC 类型,问题就开始了。数据库字段是 timestamptz,所以没关系。但是如何说服 Dapper 发送支持 UTC 的 SQL 呢?
我在这个问题上敲了很长时间。
解决方案
什么对我有用:使用“DateTimeOffset”,而不是“DateTime”C# 类型。
当您使用 DateTime 时,您可以做一些事情(DateTimeKind 等),但它们无助于 Dapper 向(在我的情况下)PostgreSQL 发送正确制定的语句。您可能会开始认为 Dapper 不能/不会帮助您。
但是,如果您的 C# 对象以 DateTimeOffset 格式存储日期,那么 Dapper 会很好地帮助您。因此,在您的课程中,当您考虑 UTC 风格时,请避免使用 DateTime 属性类型。
这可能太含糊了,但如果他们问的问题与我今天问的相同,也许足以让像我这样的下一个人走上一条好路。
PS——既然我了解了 DateTimeOffset 与 DateTime,那么 Dapper 失败的原因就很明显了。它正在从 C# 对象作为 DateTime(无时区信息)吸入的内容转换为 PostgreSQL“DateTimeOffset”(读取,timestamptz)。它注定要失败。然而,在你的 C# 对象中存储一个 DateTimeOffset,当 Dapper 为数据库提供一个带时区的日期时间时,Dapper 将很乐意提供所有详细信息,包括日期、时间和以小时为单位的相关偏移量。
推荐阅读
- payment - Sagepay 问题 - 在 3D 安全身份验证后检索交易不工作
- javascript - 如何在 JavaScript 中使用 Express 显示来自 RESTful API 的单个值
- laravel - 使用表单发送带附件的电子邮件
- google-sheets - 谷歌表格查询公式问题
- django - Django ManyToManyField 未显示在管理员中
- python - 如何读取 cv2.findContours 的结果?
- c# - 如何分配集线器名称?
- python - 基于Web的Python包下载工具
- spring - 通过 .yml 文件中的 @Value 为 HashMap 注入不存在的属性
- java - 在 Android 中使用访问密钥 ID 秘密访问密钥的 Amazone aws KVS 视频流