2013-08-17 55 views
0

我試圖發送SQL語句編寫到MySQL數據庫。這是我有:語法錯誤在WHERE子句近「?)AND(日期=?)」

String sql1 = "SELECT idReimbursed_Funds As idReimFunds FROM reimbursedfunds Where ReimFundsName = ? AND Date = ?"; 
    PreparedStatement pstmt1 = conn.prepareStatement(sql1); 
    pstmt1.setString(1, reimfund.getReimFundsName()); 
    pstmt1.setDate(2, (Date) reimfund.getDate()); 
    ResultSet rs1 = pstmt1.executeQuery(sql1); 
    while(rs1.next()){        
     idReimFunds = rs1.getInt("idReimFunds");             
    } 

谷歌搜索這個問題後,我發現解決方案,以使用周圍的問號括號或整個where子句,如:

String sql1 = "SELECT idReimbursed_Funds As idReimFunds FROM reimbursedfunds Where (ReimFundsName = ?) AND (Date = ?)"; 

這並沒有工作,雖然。我得到了與我的原始代碼相同的錯誤消息:

「您的SQL語法錯誤;請查看與您的MySQL服務器版本相對應的手冊,以獲取正確的語法以在'?'附近使用)AND(日期=?)'在第1行。

當我嘗試SQL語句在MySQL Workbench工作正常。有沒有辦法使用2 where JDBC子句?我知道在其他職位人們已經回答說,它必須被作爲兩個不同的查詢,但我想我會問以防萬一別人讀取這個職位和的一種方式。謝謝你!

回答

2

問題(除了由BGP提到Date問題),是行:

ResultSet rs1 = pstmt1.executeQuery(sql1); 

你總是試圖在一份聲明中執行一個查詢字符串,這是不被JDBC標準所允許(MySQL的其實應該拋出一個異常,而不是因爲它目前並把它發送給服務器,但最終的結果是一樣的)。的Statement.executeQuery(String sql)文檔說:

拋出:
      SQLException - 如果發生數據庫訪問錯誤,這種方法被稱爲在一個封閉的Statement,給定的SQL語句生成以外的任何其他單一ResultSet對象,的方法被稱爲在PreparedStatementCallableStatement

(重點煤礦)

的原因是,你要執行的準備好的聲明,沒有其他任何的查詢。您應該致電PreparedStatement.executeQuery()(因此不帶參數):

ResultSet rs1 = pstmt1.executeQuery(); 
+0

是的,就是這樣。謝謝。現在問題解決了! – teppuus

2

很肯定這是因爲「日期」是一個MySQL的關鍵字(保留)。將該字段稱爲別的或者其他的斗篷它與反引號,即`Date`

+0

感謝您的建議。我將列名更改爲DatePaid,但仍然出現錯誤。 「你在你的SQL語法錯誤;檢查對應於你的MySQL服務器版本使用附近的正確語法手冊‘AND DatePaid =?’在第1行「 – teppuus