postgresql - 运算符不存在:@timestamp without time zone
问题描述
在通过 dotConnect 7.7.832 .NET 连接器从 c# 代码向 PostgreSQL 10.14 发出的参数化查询中,如果参数为 NULL,我选择参数值或本地时间戳:
using (var cmd = new PgSqlCommand("select COALESCE(@eventTime, LOCALTIMESTAMP)", connection)
执行时,此语句会在主题中引发错误。如果我注释掉对应的参数
cmd.Parameters.Add("@eventTime", PgSqlType.TimeStamp).Value = DateTime.Now;
和硬编码
using (var cmd = new PgSqlCommand("select COALESCE('11/6/2020 2:36:58 PM', LOCALTIMESTAMP)", connection)
或者如果我转换参数
using (var cmd = new PgSqlCommand("select COALESCE(cast(@eventTime as timestamp without time zone), LOCALTIMESTAMP)", connection)
然后它工作。谁能解释@
错误中的运算符指的是什么以及为什么会出现错误?
解决方案
在不起作用的情况下,您的 .Net 连接库似乎正在将包含文字的 SQL 命令传递@
给数据库,而不是替换它。数据库假定您正在尝试@
用作用户定义的运算符,因为它不知道它可能是什么。但是没有定义这样的运算符。
为什么这样做?我不知道。这是关于您的 .Net 连接库的问题,而不是关于 PostgreSQL 本身的问题,因此您可能需要添加标签。
您从数据库获得的错误消息应该包括它收到的查询文本(而不是您认为它发送的文本),并且在这种情况下看到它通常很有用。如果客户端的错误消息中没有该文本(某些连接库不会忠实地传递此信息),您应该能够直接从 PostgreSQL 服务器的日志文件中提取它。
推荐阅读
- javascript - 为什么 [1,2,3] <= [1,2,3] 在 javascript 中为真?
- reactjs - 无法读取未定义的属性“showNotification”
- django - 将 BinaryField 的文件上传小部件添加到 Django Admin
- c++ - 我需要做什么才能让 cocoapods 用 C++ 构建?
- angular - 不调用订阅的角度http更新
- reactjs - 访问 Observable 数组的元素
- amazon-web-services - aws - 如何将 API Gateway 中的阶段变量传递给 Lambda 函数?
- jquery - FancyBox - 单击时交换图像
- spring-mvc - 动态创建的下拉列表不返回值
- django - 根据 ID 获取对象