我试图将值插入数据库,但问题是输入是可变的,可以更改。例如,对于要插入的第一行,它有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,根据过去的历史,我们过去每个季度都会有多次更改。
1条答案
按热度按时间jtjikinw1#
您需要将
@vals
替换为要插入的列值的数量,并且需要将它们全部作为参数添加。字符串
我建议你不要这样做。你最好只是硬编码列,因为这样你也可以指定参数类型。甚至更好:如果你只是做一个插入,那么use a bulk copy mechanism,这将快得多。