如何在Npgsql中将查询的表名作为命令参数提供?

我想提供查询的表名作为命令参数,如下所示:

public class Foo { private const String myTableName = "mytable"; public void Bar() { NpgsqlCommand command = new NpgsqlCommand("SELECT * from :tableName", connection); command.Parameters.Add(new NpgsqlParameter("tableName", DbType.String)); command.Parameters[0].Value = myTableName; } } 

这似乎导致了这个查询: "SELECT * from E'mytable'"导致错误(请注意单引号)。

我真的需要为此进行字符串连接吗? 从安全角度来看无关紧要,因为用户无法更改表名,但创建SQL查询的字符串连接总是让我感到毛骨悚然……

谢谢,埃里克

表名不能作为参数发送。 表名在解析时解析,因为它们是计划和这些事情所需要的。 参数仅在执行程序(或必要时的优化程序)时替换。

所以是的,你需要使用字符串替换它。 当然,只要表名来自你class级的const,这不是安全问题(甚至是成为一个人的风险)。

但是如果你从用户输入构造表名,你需要非常小心。 但通常如果你需要从用户输入构造表名,那么首先在数据库中设计的东西很糟糕,应该修复(是的,当然有例外)。