PostgreSQL,Npgsql返回42601:语法错误在或接近$1“;
我试图使用Npgsql和/或Dapper查询一个表,但一直遇到PostgreSQL,Npgsql返回42601:语法错误在或接近$1“;,postgresql,dapper,npgsql,Postgresql,Dapper,Npgsql,我试图使用Npgsql和/或Dapper查询一个表,但一直遇到Npgsql.postgrescexception 42601:语法错误在“$1”处或附近。 以下是我用NpgsqlCommand尝试的结果: using (var conn = new NpgsqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["postgres"].ConnectionString)) { conn.Op
Npgsql.postgrescexception 42601:语法错误在“$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(我的首选方法),包括:
我做错了什么?我非常感谢您的反馈。谢谢。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\u date
是数据类型date
),您可以简化:
"SELECT * FROM logs.logs WHERE log_date > CURRENT_DATE - @days;"
并将@days
作为不带引号的数字文字(仅限数字)提供-它被视为整数。这甚至更有效,因为日期
-整数
返回日期
,而日期
-间隔
返回时间戳
我使用DapperExtensions获得此错误
添加
DapperExtensions.DapperExtensions.SqlDialect = new PostgreSqlDialect();
DapperAsyncExtensions.SqlDialect = new PostgreSqlDialect();
在创建连接之前,解决了这个问题太棒了,成功了。我知道这一定很简单,只是不太明白。谢谢
"SELECT * FROM logs.logs WHERE log_date > CURRENT_DATE - @days;"
DapperExtensions.DapperExtensions.SqlDialect = new PostgreSqlDialect();
DapperAsyncExtensions.SqlDialect = new PostgreSqlDialect();