运算符不存在:@时间戳(无时区)

时间:2020-11-06 21:52:21

标签: postgresql c#

在从c#代码通过dotConnect 7.7.832 .NET连接器发布到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)

然后它起作用。任何人都可以解释错误中的@运算符是指什么以及为什么会出错吗?

1 个答案:

答案 0 :(得分:0)

在无法正常工作的情况下,您的.Net连接库似乎正在将包含文字@的SQL命令传递给数据库,而不是替代它。数据库假定您正在尝试将@用作用户定义的运算符,因为它不知道还可能是什么。但是尚未定义此类运算符。

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

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

相关问题