postgresql 如何在列数不固定时为NpgsqlCommand设置参数

tyu7yeag  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(134)

我试图将值插入数据库,但问题是输入是可变的,可以更改。例如,对于要插入的第一行,它有15列,但下一行有12列。除了少数几列,其他列都不是强制性的。
我想做的是,用准系统插入查询来创建一个字符串

private static string INSERT_QUERY = "INSERT INTO table (cols) VALUES (@vals)";

using var query = new NpgsqlCommand(INSERT_QUERY.Replace("cols", string.Join(",", columnsAndValues[0])), rawConnection)
            {
                Parameters =
                {
                    new ("vals", columnsAndValues[1])
                }
            };
var recordsAffected = await query.ExecuteNonQueryAsync();

字符串
数组columnsAndValues是由服务解析的,从客户端输入。索引0是列字段,1是值。我面临的错误是这样的,Npgsql.PostgresException:'42601:Npgsql的目标列比表达式多。我怀疑的是,在查询中有“x”个列,但只有1个值。
有没有办法颠覆这一点?
我们以前有合约类,我们用来创建合约类的对象,然后客户端用来发送它,所以它有固定数量的列和值,但我们放弃了,因为改变表中的1列意味着,同样的更改也必须在代码库中更新,所以每次更新两次更改/PR,根据过去的历史,我们过去每个季度都会有多次更改。

jtjikinw

jtjikinw1#

您需要将@vals替换为要插入的列值的数量,并且需要将它们全部作为参数添加。

var sql = INSERT_QUERY
    .Replace("cols", string.Join(",", columnsAndValues[0]))
    .Replace("@vals", string.Join(",", columnsAndValues[0].Select(c => "@" + c)));

using var query = new NpgsqlCommand(sql, rawConnection);
for (var i = 0; i < columnsAndValues[0].Length; i++)
    query.Parameters.AddWithValue("@" + columnsAndValues[0][i], columnsWithValues[1][i]); 

var recordsAffected = await query.ExecuteNonQueryAsync();

字符串
我建议你不要这样做。你最好只是硬编码列,因为这样你也可以指定参数类型。甚至更好:如果你只是做一个插入,那么use a bulk copy mechanism,这将快得多。

相关问题