PostgreSQL, Npgsql返回42601:在"$1 "或附近有语法错误[英] PostgreSQL, Npgsql returning 42601: syntax error at or near "$1"

本文是小编为大家收集整理的关于PostgreSQL, Npgsql返回42601:在"$1 "或附近有语法错误的处理方法,想解了PostgreSQL, Npgsql返回42601:在"$1 "或附近有语法错误的问题怎么解决?PostgreSQL, Npgsql返回42601:在"$1 "或附近有语法错误问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试使用 Npgsql 和/或 Dapper 查询表,但我一直遇到 Npgsql.PostgresException 42601: syntax error at or near "$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(我的首选方法):

  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 "$1" error. 异常中的语句显示:select * from Logs.Logs where Log_Date > current_date - interval $1 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,而不是旨在创建该区间的表达式的一部分.

本文地址:https://www.itbaoku.cn/post/1763933.html