[英]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.