使用Dapper与Npgsql操作Postgres的INTERVAL时出现语法错误
问题原因及解决方法
你的问题出在PostgreSQL的INTERVAL语法与参数化结合的方式上,原SQL写法不符合PostgreSQL的参数化规则,导致语法错误。
错误原因
PostgreSQL中,INTERVAL关键字后需要跟字符串字面量(比如INTERVAL '90 DAY'),不能直接将参数插入到INTERVAL和单位之间。你原代码里的INTERVAL @ageInDays DAY写法,数据库无法识别参数的位置,因此抛出语法错误。
修正方案
推荐以下两种可行的修正方式:
方案1:用数值乘以固定间隔(推荐)
修改SQL语句,将int类型的天数参数乘以INTERVAL '1 DAY',Npgsql支持这种数值与间隔的运算,完美适配你当前的参数类型:
int ageInDays = 90; // 修改后的SQL语句 string mysql = "DELETE FROM Monitorvalues m1 WHERE lastupdate < current_date - @ageInDays * INTERVAL '1 DAY'"; using (var connection = GetConnection) { var dynamicParameters = new DynamicParameters(); dynamicParameters.Add("ageInDays", ageInDays); return await connection.ExecuteScalarAsync<int>(mysql, dynamicParameters); }
方案2:传递完整的间隔字符串
如果你愿意调整参数类型,也可以直接传递符合PostgreSQL间隔格式的字符串:
string ageInterval = "90 DAY"; string mysql = "DELETE FROM Monitorvalues m1 WHERE lastupdate < current_date - INTERVAL @ageInterval"; using (var connection = GetConnection) { var dynamicParameters = new DynamicParameters(); dynamicParameters.Add("ageInterval", ageInterval); return await connection.ExecuteScalarAsync<int>(mysql, dynamicParameters); }
验证说明
两种方案都能让Dapper正确将参数传递给PostgreSQL,避免语法错误。第一种方案保留了你原本的int参数类型,无需额外类型转换,更贴合现有代码逻辑。
内容的提问来源于stack exchange,提问作者jason.kaisersmith
相关产品推荐
相关产品推荐

