PostgreSQL,Npgsql 返回 42601:“$1”处或附近的语法错误

PostgreSQL, Npgsql returning 42601: syntax error at or near "$1"

我正在尝试使用 Npgsql and/or Dapper 查询 table 并且我将 运行 保存到 Npgsql.PostgresException 42601: syntax error at or near "".

这是我用 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(我的首选方法):

  using (var conn = new NpgsqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["postgres"].ConnectionString))
  {
    conn.Open();
    var logs = conn.Query<Log>("select * from Logs.Logs where Log_Date > current_date - interval @days day;", new {days = days});

无论哪种方式,我都得到相同的 Npgsql.PostgresException 42601: syntax error at or near "" error. 异常中的语句显示:select * from Logs.Logs where Log_Date > current_date - interval day

请注意,如果我执行以下操作,它可以正常工作,但参数化不正确:

var logs = conn.Query<Log>("select * from Logs.Logs where Log_Date > current_date - interval '" + days + "' day;");

我做错了什么?我非常感谢任何反馈。谢谢。

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_date 是数据类型 date),您可以简化:

"SELECT * FROM logs.logs WHERE log_date > CURRENT_DATE - @days;"

并提供 @days 作为未加引号的数字文字(仅限数字)- 这被视为 integer。这样效率更高,因为 date - integer returns date,而 date - interval returns timestamp.

The manual about interval input.

我在使用 DapperExtensions 时遇到了这个错误

添加

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

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