簡體   English   中英

PostgreSQL,Npgsql返回42601:語法錯誤在“$ 1”或附近

[英]PostgreSQL, Npgsql returning 42601: syntax error at or near “$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,而不是用於創建該間隔的表達式的一部分。

要從日期中減去天數(假設log_date是數據類型date ),您可以簡化:

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

並將@days提供為不帶引號的數字文字(僅限數字) - 它被視為一個integer 這更有效,因為date - integer返回date ,而date - interval返回timestamp

關於間隔輸入的手冊。

我使用DapperExtensions得到了這個錯誤

加入

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

在創建連接之前修復了問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM