我试图在我的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,是不是因为它不被允许?如果还有其他办法吗?
任何帮助将不胜感激:)
答案 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执行它。