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

Eri*_*fer 3 .net c# sql postgresql 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,埃里克

Mag*_*der 5

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

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

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