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

3

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

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查询时进行字符串拼接总是让我感到不安...
谢谢, Eric
1个回答

6

表名不能作为参数发送。由于需要进行规划等操作,表名在解析时就已经被确定。参数只会在执行器(或必要时优化器)时间被替换。

所以,你需要使用字符串替换。当然,只要表名来自类中的常量,这不是安全问题(甚至没有成为一个风险的可能)。

但是,如果你从用户输入构造表名,你需要非常小心。但通常情况下,如果你需要从用户输入构造表名,那么数据库中的设计存在问题,应该进行修复(当然,也有例外情况)。


表名始终是常量。谢谢。 - EricSchaefer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接