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;");

какво правя грешно Оценявам много всяка обратна връзка. Благодаря ти.


person Tyler Jennings    schedule 10.06.2016    source източник


Отговори (3)


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, а не част от израза, предназначен да създаде този интервал.

person Shay Rojansky    schedule 10.06.2016
comment
Страхотно, това го направи. Знаех, че трябва да е нещо просто, но не можех да го разбера. Благодаря. - person Tyler Jennings; 10.06.2016

получих тази грешка, използвайки DapperExtensions

добавяне

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

преди създаване на връзката коригира проблема

person ahaliav fox    schedule 04.04.2019

За да извадите дни от дата (приемайки, че log_date е тип данни date), можете да опростите:

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

И осигурете @days като числов литерал без кавички (само цифри) - което се приема за integer. Това е още по-ефективно, тъй като date - integer връща date, докато date - interval връща timestamp.

Ръководството за интервално въвеждане.

person Erwin Brandstetter    schedule 10.06.2016