Npgsql C# 更新参数化语句

问题描述 投票:0回答:1

我正在尝试在下面的 C# 中执行参数化更新语句。

            NpgsqlConnection  _command = _dataSource.CreateCommand(
                "UPDATE \"BulkProposal\" SET \"UploadDataJson\" = NULL WHERE \"CreatedDate\" <= NOW() - INTERVAL  @deleteInterval 'days' AND \"UploadDataJson\" is not NULL;");

            _command.Parameters.AddWithValue("deleteInterval", _deleteIntervalInDays);
            _npgsqlConnection.Open();
            recordsDeleted = await _command.ExecuteNonQueryAsync();

执行上述语句时,我收到以下错误:

Unexpected Exception: 42601: syntax error at or near "$1"

POSITION: 92 | Exception Details: Npgsql.PostgresException (0x80004005): 42601: syntax error at or near "$1"

POSITION: 92
   at Npgsql.Internal.NpgsqlConnector.<ReadMessage>g__ReadMessageLong|233_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlDataSourceCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlDataSourceCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken)
   at BulkProposalDataPurge.BulkProposalDataPurge.FunctionHandler() in /home/abell/dev/proposal-service-lambdas/BulkProposalDataPurge.cs:line 53
  Exception data:
    Severity: ERROR
    SqlState: 42601
    MessageText: syntax error at or near "$1"
    Position: 92
    File: scan.l
    Line: 1188
    Routine: scanner_yyerror

问题似乎与

有关
@deleteInterval 'days'

我也尝试过

的变体
'@deleteInterval days'

不确定如何解决这个问题。

c# sql .net postgresql npgsql
1个回答
0
投票

您在 SQL 查询中使用参数的方式是导致您遇到问题的原因。当使用 Npgsql 参数化查询时,参数名称不需要在 SQL 语句本身中包含在单引号中。相反,应按原样使用参数名称。尝试以下代码,我在其中更改了您的 SQL 语句。

NpgsqlConnection _npgsqlConnection = _dataSource.CreateCommand(
    "UPDATE \"BulkProposal\" SET \"UploadDataJson\" = NULL WHERE \"CreatedDate\" <= NOW() - INTERVAL @deleteInterval days AND \"UploadDataJson\" is not NULL;");

_npgsqlConnection.Parameters.AddWithValue("deleteInterval", _deleteIntervalInDays);
_npgsqlConnection.Open();
recordsDeleted = await _npgsqlConnection.ExecuteNonQueryAsync();

在运行此代码之前,请确保 _deleteIntervalInDays 设置为正确的数字;它应该是您打算在该间隔内使用的天数。 希望它有效:)

© www.soinside.com 2019 - 2024. All rights reserved.