2009-07-29 77 views
1

我想为一个查询作为命令参数提供的表名,就像这样:如何在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查询的改变让我毛骨悚然......

感谢, 埃里克

回答

3

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

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

但是,如果你从用户输入构建表名,你需要非常小心。但通常情况下,如果您需要从用户输入中构建表名,那么首先在数据库中设计的东西设计得非常糟糕,应该加以解决(是的,当然也有例外)。

+0

表名总是常量。谢谢。 – EricSchaefer 2009-07-30 11:19:35

相关问题