2015-08-21 50 views
0

因此,我創建了一個搜索函數,用戶可以根據這些字段選擇要輸入的字段和數據庫查詢,忽略未輸入的字段。以下是我正在使用的代碼嘗試實現此目的:帶有可選參數的PreparedStatement SQL

PreparedStatement ps = DeviceTracker.getConnection().prepareStatement("use SBK_CAPE_COOKIES SELECT * FROM \"CC_Employees\"" 
                      +"WHERE EmployeeID LIKE ? AND FirstName LIKE ? AND Surname LIKE ? AND Email LIKE ? AND Region LIKE ? AND Department LIKE ?" 
                      ,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
    if (!jTextField6.getText().isEmpty()) ps.setInt(1, Integer.parseInt(jTextField6.getText())); 
    else ps.setString(1, "'%'"); 
    if (!jTextField5.getText().isEmpty()) ps.setString(2, "'"+jTextField5.getText()+"'"); 
    else ps.setString(2, "'%'"); 
    if (!jTextField4.getText().isEmpty()) ps.setString(3, "'"+jTextField4.getText()+"'"); 
    else ps.setString(3, "'%'"); 
    if (!jTextField3.getText().isEmpty()) ps.setString(4, "'"+jTextField3.getText()+"'"); 
    else ps.setString(4, "'%'"); 
    if(!jComboBox1.getSelectedItem().equals("All")) ps.setString(5, "'"+jComboBox1.getSelectedItem().toString()+"'"); 
    else ps.setString(5, "'%'"); 
    if(!jComboBox2.getSelectedItem().equals("All")) ps.setString(6, "'"+jComboBox2.getSelectedItem().toString()+"'"); 
    else ps.setString(6, "'%'"); 
    ResultSet rs = ps.executeQuery(); 

ResultSet'rs'每次都是空的。我究竟做錯了什麼?

+0

這些值被設置爲'%',這就是LIKE被使用的原因。我不會留下任何空的。 –

+2

刪除setString方法中的單引號。他們將根據準備好的聲明自動設置。 – Jens

+0

嗯,我不覺得愚蠢。這是問題。謝謝你,先生。 –

回答

2

刪除setString方法中的單引號。他們將根據準備好的聲明自動設置。

PreparedStatement ps = DeviceTracker.getConnection().prepareStatement("use SBK_CAPE_COOKIES SELECT * FROM \"CC_Employees\"" 
                      +"WHERE EmployeeID LIKE ? AND FirstName LIKE ? AND Surname LIKE ? AND Email LIKE ? AND Region LIKE ? AND Department LIKE ?" 
                      ,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
    if (!jTextField6.getText().isEmpty()) ps.setInt(1, Integer.parseInt(jTextField6.getText())); 
    else ps.setString(1, "%"); 
    if (!jTextField5.getText().isEmpty()) ps.setString(2, jTextField5.getText()); 
    else ps.setString(2, "%"); 
    if (!jTextField4.getText().isEmpty()) ps.setString(3, jTextField4.getText()); 
    else ps.setString(3, "%"); 
    if (!jTextField3.getText().isEmpty()) ps.setString(4, jTextField3.getText()); 
    else ps.setString(4, "%"); 
    if(!jComboBox1.getSelectedItem().equals("All")) ps.setString(5, jComboBox1.getSelectedItem().toString()); 
    else ps.setString(5, "%"); 
    if(!jComboBox2.getSelectedItem().equals("All")) ps.setString(6, jComboBox2.getSelectedItem().toString()); 
    else ps.setString(6, "%"); 
    ResultSet rs = ps.executeQuery(); 

你的話的結果somithing像WHERE EmployeeID LIKE '1' AND FirstName LIKE '''firstname'''

但我認爲這不是你的方法的一個很好的設計。你應該動態地生成你的查詢,所以你只添加使用的參數。

+0

你是對的,但那會花費我更多的時間。這樣做並不會減慢速度。我必須編寫另一個具有更多參數的搜索函數。也許我會嘗試一下你的建議。 –