Npgsql C#参数化Update语句中Interval语法错误求助
解决PostgreSQL中Npgsql参数化INTERVAL的语法错误
你遇到的语法错误是因为PostgreSQL不支持INTERVAL @参数 '单位'这种写法,正确的参数化INTERVAL方式有两种,推荐使用数值乘以单个INTERVAL单位的写法,更安全且符合语法规范:
正确写法示例
var command = _dataSource.CreateCommand( @"UPDATE ""BulkProposal"" SET ""UploadDataJson"" = NULL WHERE ""CreatedDate"" <= NOW() - @deleteInterval * INTERVAL '1 day' AND ""UploadDataJson"" IS NOT NULL;"); command.Parameters.AddWithValue("deleteInterval", _deleteIntervalInDays); await _npgsqlConnection.OpenAsync(); recordsDeleted = await command.ExecuteNonQueryAsync();
写法说明
PostgreSQL的INTERVAL语法规则:
- 不能将数值参数和单位字符串分开写在
INTERVAL关键字后 - 可以通过数值参数乘以单个INTERVAL单位的方式实现动态间隔,比如
@deleteInterval * INTERVAL '1 day',数据库会正确识别参数并计算时间差
可选替代写法(不推荐)
如果一定要用字符串形式传递完整间隔,可以将参数设为包含数值和单位的字符串:
var command = _dataSource.CreateCommand( @"UPDATE ""BulkProposal"" SET ""UploadDataJson"" = NULL WHERE ""CreatedDate"" <= NOW() - INTERVAL @intervalString AND ""UploadDataJson"" IS NOT NULL;"); command.Parameters.AddWithValue("intervalString", $"{_deleteIntervalInDays} days"); await _npgsqlConnection.OpenAsync(); recordsDeleted = await command.ExecuteNonQueryAsync();
这种写法需要确保参数内容安全(避免SQL注入风险),因此优先推荐第一种数值相乘的写法。
内容的提问来源于stack exchange,提问作者dionysus
相关产品推荐
相关产品推荐

