PostgreSQL,Npgsql 返回 42601:“$1”处或附近的语法错误
PostgreSQL, Npgsql returning 42601: syntax error at or near "$1"
我正在尝试使用 Npgsql and/or Dapper 查询 table 并且我将 运行 保存到 Npgsql.PostgresException 42601: syntax error at or near "".
这是我用 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 "" error.
异常中的语句显示:select * from Logs.Logs where Log_Date > current_date - interval 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
returns date
,而 date
- interval
returns timestamp
.
我在使用 DapperExtensions 时遇到了这个错误
添加
DapperExtensions.DapperExtensions.SqlDialect = new PostgreSqlDialect();
DapperAsyncExtensions.SqlDialect = new PostgreSqlDialect();
在创建连接之前解决了问题
我正在尝试使用 Npgsql and/or Dapper 查询 table 并且我将 运行 保存到 Npgsql.PostgresException 42601: syntax error at or near "".
这是我用 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 "" error.
异常中的语句显示:select * from Logs.Logs where Log_Date > current_date - interval 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
returns date
,而 date
- interval
returns timestamp
.
我在使用 DapperExtensions 时遇到了这个错误
添加
DapperExtensions.DapperExtensions.SqlDialect = new PostgreSqlDialect();
DapperAsyncExtensions.SqlDialect = new PostgreSqlDialect();
在创建连接之前解决了问题