不允许SQL表参数化?

时间:2012-06-21 16:03:12

标签: c# sql parameters

我试图在我的sql查询中使用这样的一些参数;

    Answer_table = new MySqlParameter("@answerTable", AT);
    MySqlCommand solved_q = new MySqlCommand("SELECT * FROM @answerTable WHERE UserID = @uID", c2.get_con());
    solved_q.Parameters.Add(Answer_table);
    solved_q.Parameters.Add(uID);

但它没有像我预期的那样工作。当我不使用表名参数(@answerTable)时,它适用于uID,是不是因为它不被允许?如果还有其他办法吗?

任何帮助将不胜感激:)

4 个答案:

答案 0 :(得分:3)

您不能使用参数指定FROM子句。

您可以通过构建实际字符串来构造SQL语句:

new MySqlCommand(String.Format("SELECT * FROM {0} WHERE UserID = @uID"
                 , answertable)
                 , c2.get_con());

注意 - 请务必通过不允许操纵ansertable变量来防范SQL注入攻击。

答案 1 :(得分:2)

这是不允许的,因为它是DBMS为准备语句编译其执行路径所需的信息的一部分。

在准备之前,您必须在运行时将该语句构建为字符串。幸运的是,大多数DBMS仍会缓存准备好的状态。

重要提示:如果表的名称以任何方式来自“外部”(例如HTML请求中的参数),则必须非常小心以避免SQL注入(即:某人可以传递邪恶的东西)比如“table1; drop table table1”而不是你期望的那样,这会以意想不到的方式改变你的SQL语句的含义。)

答案 2 :(得分:0)

尝试

MySqlCommand solved_q = new MySqlCommand(
    String.Format("SELECT * FROM {0} WHERE UserID = @uID", AT),
    c2.get_con());
solved_q.Parameters.AddWithValue("@uID", uID); 

由于AT是以编程方式确定的(我希望),而不是由用户输入,因此这里不会出现SQL注入问题。

答案 3 :(得分:0)

通过它的声音你正在做一个SELECT,所以你不是在创建一个新的表...就是说,查询时数据库中的表已经知道了。通过查询db以获取有效表的列表来利用这一事实。首先填充列表,然后验证您提供的表名以获得完整性。如果它在有效列表中,则创建一个字符串并对db执行它。