1

代码:

string sqlCommand = @"UPDATE table SET active = 0 WHERE id IN (@CommaSeparatedId)";
string sqlParamName = "CommaSeparatedId";
string sqlParamValue = "111, 222";

try
{
    using (NpgsqlConnection connection = new NpgsqlConnection())
    {
        // Get connection string from Web.config
        connection.ConnectionString = _connectionString;
        connection.Open();
        Int32 rowsAffected;

        using (NpgsqlCommand command = new NpgsqlCommand(sqlCommand, connection))
        {
            NpgsqlParameter sqlParam = new NpgsqlParameter(sqlParamName, NpgsqlTypes.NpgsqlDbType.Varchar);
            // Code below no exception occur, and active not updated to 0
            // sqlParam.Value = sqlParamValue;

            // This code works for only one value
            sqlParam.Value = "111";

            command.Parameters.Add(sqlParam);
            rowsAffected = command.ExecuteNonQuery();
        }
    }
}
catch (NpgsqlException pgEx)
{
    throw pgEx;
}

问题是:

如果我使用111, 222rowsAffected sqlParam.Value'= 0 , but if I'm using only111 or222 rowsAffected = 1`。这意味着当只有 1 个值时更新成功,但如果尝试更新超过 1 个值则失败。


预期查询:

UPDATE table
    SET active = 0
WHERE id IN ('111', '222');

我在上面的代码中缺少什么?

4

1 回答 1

2

您面临的问题是由于参数值“111,222”将被数据库引擎视为不是两个不同的值,而是一个。
数据库搜索 ID = "111,222" 的记录,但找不到任何与请求匹配的记录。
您应该尝试使用存储过程并根据 PostgreSQL 要求的语法执行动态 SQL

于 2012-10-29T15:16:26.393 回答