2016-04-13 74 views
1

我有一個用戶生成的帶有佔位符的SQL語句(如SELECT * FROM films WHERE stars > ? AND length > ?)和任意數量的值應該插入的值的輸入。我遍歷輸入以將所有這些輸入插入到PreparedStatement中,但我不知道編譯時有多少個佔位符PreparedStatement以及用戶提供了多少個輸入。檢查PreparedStatement中的所有佔位符是否填充

據我瞭解,應該路要走是趕上SQLExceptionpreparedStatement.execute(),即「未指定值的佔位符。」這告訴我,但它不爲我工作的原因有很多:

  • 我不知道在編譯時這DB將被使用,SQLException可以是任何東西
  • 未公開佔位符,應以某種方式來處理(尤其是這是正常情況),失去了以另一種方式連接(這是真的錯誤)

在生成的查詢還搜索?不起作用,因爲它會在下面的語句失敗:SELECT * FROM films WHERE title = 'Who Framed Roger Rabbit?'

那麼,有沒有什麼辦法執行前必須檢查的PreparedStatement完整性?

+0

這些「顯而易見的原因」是什麼,爲什麼獲得「'?」的數目不起作用?捕獲該異常也是有效的,因爲查詢從來沒有發送到dbms,而是在querys編譯期間創建。 – f1sh

+0

爲什麼用戶可以發送比您在後端使用更多的輸入? – dambros

+0

@ f1sh更新的問題更清楚 – chuwy

回答

3

看看java.sql.ParameterMetaData,它應該包含您的PreparedStatement(包括參數計數)的各種信息。

PreparedStatement pstmt = ... 
ParameterMetaData metadata = pstmt.getParameterMetaData(); 
int pcount = metadata.getParameterCount(); 

pcount將包含參數的數量。請注意,pstmt.getParameterMetaData()將連接到數據庫

所以,當迭代你的輸入和綁定參數時,你可以確保(在運行時)所有參數都被綁定。

+0

謝謝你和@JoopEggen。我看着pstmt.getMetaData(),但並沒有意識到getParameterMetaData()是不同的方法。 – chuwy