2013-03-13 62 views
0

我想知道我可以在这个格式我可以写我的SQL查询这样

String update = "UPDATE ? SET Status = ? WHERE Name = ?"; 
stmt.setString(1,tableName); 
stmt.setString(2,status); 
stmt.setString(3,name); 

插入同样的表名的插入和删除报表?

+6

你尝试过吗? – Dreamwalker 2013-03-13 12:30:50

+3

不,您不能参数化表名。使用动态SQL – Joe2013 2013-03-13 12:31:19

+0

你可以但只能使用这不是做的动态SQL。如果你不小心,动态SQL会打开你的SQL注入。 – xQbert 2013-03-13 12:31:59

回答

5

你把问号查询的原因(除了防止SQL注入)是为了使数据库可以准备准备的语句使用不同的参数声明一次和使用。如果它不知道你正在使用哪个表格,它将无法编写一份声明。

1

通常情况下,你可以这样做,如下图所示...

String sql = "UPDATE " + tableName " SET Status = ? WHERE Name = ?"; 

    PreparedStatement stmt = null; 

    try { 
     stmt = connection.prepareStatement(sql); 
     stmt.setString(1, status); 
     stmt.setString(2, name); 
     stmt.executeUpdate(); 
    } finally { 
     if (stmt != null) { 
      stmt.close(); 
     } 
    } 
3

简短的答案是否定的。但你可以这样做:

String update = "UPDATE " + tableName + " SET Status = ? WHERE Name = ?"; 
... 
stmt.setString(1,status); 
stmt.setString(2,name); 

虽然知道SQL注入。确保你的tableName来自安全源。

0

不,你不能这样做,因为你一定在使用准备好的语句。你无法做到这一点的原因是PreparedStatement是预编译的,所以它需要你正在修改的表(使用DML的数据)或结构上(使用DDL)的表。如果您没有提到表格名称,该语句将如何预编译?

如果你想要你可以使用动态SQL,但在这种情况下,你不必使用PreparedStatement,你可以使用一个更简单的实现Statement来使用它。

希望这是有帮助的!

相关问题