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 查询的字符串连接总是让我毛骨悚然......

谢谢,埃里克

4

1 回答 1

5

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

所以是的,你需要使用字符串替换。当然,只要表名来自您班级中的 const,这不是安全问题(甚至没有成为安全问题的风险)。

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

于 2009-07-30T09:20:58.093 回答