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