代码之家  ›  专栏  ›  技术社区  ›  EricSchaefer

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

  •  3
  • EricSchaefer  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  5
  •   Magnus Hagander    15 年前

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

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

    但是,如果您确实从用户输入构造表名,则需要非常小心。但是,通常,如果需要从用户输入构造表名,那么数据库中的某些东西首先设计得不好,应该得到修复(是的,当然也有例外)。