2013-03-13 25 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來使用它。

希望這是有幫助的!

相關問題