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

时间:2009-07-29 09:54:11

标签: c# .net 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;
    }
}

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

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

谢谢, 埃里克

1 个答案:

答案 0 :(得分:5)

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

所以是的,你需要使用字符串替换它。只要表名来自班级中的const,这不是安全问题(甚至可能成为一个安全问题)。

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