首页 > 解决方案 > 运算符不存在:@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)

然后它工作。谁能解释@错误中的运算符指的是什么以及为什么会出现错误?

标签: postgresqlc#

解决方案


在不起作用的情况下,您的 .Net 连接库似乎正在将包含文字的 SQL 命令传递@给数据库,而不是替换它。数据库假定您正在尝试@用作用户定义的运算符,因为它不知道它可能是什么。但是没有定义这样的运算符。

为什么这样做?我不知道。这是关于您的 .Net 连接库的问题,而不是关于 PostgreSQL 本身的问题,因此您可能需要添加标签。

您从数据库获得的错误消息应该包括它收到的查询文本(而不是您认为它发送的文本),并且在这种情况下看到它通常很有用。如果客户端的错误消息中没有该文本(某些连接库不会忠实地传递此信息),您应该能够直接从 PostgreSQL 服务器的日志文件中提取它。


推荐阅读