1

我正在尝试在我的 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

4 回答 4

3

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

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

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

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

于 2012-06-21T16:05:41.953 回答
2

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

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

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

于 2012-06-21T16:07:30.993 回答
0

听上去你正在做一个 SELECT,所以你没有创建一个新表......话虽如此,查询时数据库中的表是已知的。通过在数据库中查询有效表的列表来利用这一事实。首先填充一个列表,然后验证为您提供的表名是否正确。如果它在有效列表中,则创建一个字符串并针对 db 执行它。

于 2012-09-07T19:57:32.823 回答
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 注入问题。

于 2012-06-21T16:06:40.637 回答