PostgreSQL,Npgsql返回42601:语法错误在或接近$1“;

PostgreSQL,Npgsql返回42601:语法错误在或接近$1“;,postgresql,dapper,npgsql,Postgresql,Dapper,Npgsql,我试图使用Npgsql和/或Dapper查询一个表,但一直遇到Npgsql.postgrescexception 42601:语法错误在“$1”处或附近。 以下是我用NpgsqlCommand尝试的结果: using (var conn = new NpgsqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["postgres"].ConnectionString)) { conn.Op

我试图使用Npgsql和/或Dapper查询一个表,但一直遇到
Npgsql.postgrescexception 42601:语法错误在“$1”处或附近。

以下是我用NpgsqlCommand尝试的结果:

  using (var conn = new NpgsqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["postgres"].ConnectionString))
  {
    conn.Open();
    using (NpgsqlCommand command = new NpgsqlCommand("select * from Logs.Logs where Log_Date > current_date - interval @days day;", conn))
    {
      command.Parameters.AddWithValue("@days", days);
      var reader = command.ExecuteReader();
我还尝试了Dapper(我的首选方法),包括:


我做错了什么?我非常感谢您的反馈。谢谢。

PostgreSQL不允许您在查询中的任何位置粘贴参数。您可以通过以下方式实现所需:

var command = new NpgsqlCommand("select * from Logs.Logs where Log_Date > current_date - @days", conn))
command.Parameters.AddWithValue("@days", TimeSpan.FromDays(days));

通过这种方式,您直接将时间间隔从Npgsql传递到PostgreSQL,而不是设计用于创建该时间间隔的表达式的一部分。

要从日期中减去天数(假设
log\u date
是数据类型
date
),您可以简化:

"SELECT * FROM logs.logs WHERE log_date > CURRENT_DATE - @days;"
并将
@days
作为不带引号的数字文字(仅限数字)提供-它被视为
整数。这甚至更有效,因为
日期
-
整数
返回
日期
,而
日期
-
间隔
返回
时间戳


我使用DapperExtensions获得此错误

添加

DapperExtensions.DapperExtensions.SqlDialect = new PostgreSqlDialect();
DapperAsyncExtensions.SqlDialect = new PostgreSqlDialect();

在创建连接之前,解决了这个问题

太棒了,成功了。我知道这一定很简单,只是不太明白。谢谢
"SELECT * FROM logs.logs WHERE log_date > CURRENT_DATE - @days;"
DapperExtensions.DapperExtensions.SqlDialect = new PostgreSqlDialect();
DapperAsyncExtensions.SqlDialect = new PostgreSqlDialect();