2014-02-17 82 views
0

我製作了一個組件,其中包含一個文本字段和一個列表,其中的文本字段中的鍵名被監聽並相應地生成結果集並添加到列表中。 當我刪除鍵入的鍵並輸入新的鍵時,它不起作用。結果集不會相應地再次獲取。該怎麼辦?結果集(java.sql)對象在生成結果集後不會獲取數據

代碼:

@Override 
    public void keyTyped(KeyEvent ke) { 

    searchstring = searchstring + ke.getKeyChar(); 
    System.out.println(searchstring); 
    try {    
       Class.forName("com.mysql.jdbc.Driver"); 
     } catch (ClassNotFoundException ex) { 

       System.out.println(ex.toString()); 

      } 

     try { 
       Connection con = DriverManager.getConnection(url+databasename,username,password); 

       Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 

       String s = "select "+columnname+" from "+tablename+" where "+columnname+" like "+"'"+searchstring+"%"+"'"; 
       System.out.println(s); 
       ResultSet rs = st.executeQuery(s); 
       list.removeAll(); 
       while(rs.next()){ 

        System.out.println(rs.getString(1)); 
        list.add(rs.getString(1)); 
       } 

     }catch(Exception ex){ 

      System.out.println(ex.toString()); 

     } 



} 
+0

你「清」你搜索字符串後,您刪除輸入密鑰? – JohnnyAW

+0

你真的*調試過*你的代碼嗎? :) –

+1

正確關閉資源。使用準備好的語句。處理BackSpace char,不要只添加到searchString ..如果可能的話根據您的需要使用Stringbuffer/StringBuilder – Mani

回答

0

你不斷追加鍵入的字符搜索字符串:

searchstring = searchstring + ke.getKeyChar(); 

因爲這個搜索將不斷變化,你鍵入的 - 無論是當你輸入,使用回空間擦除該字段。在末尾searchstring將不匹配您在數據庫中的任何內容。這就是爲什麼名單不會改變!

而不是修改searchstring,創建另一個變量來追加鍵字符並在查詢的where子句中使用該值。

注意:這種將用戶輸入追加到查詢中的方式會打開您的應用程序以進行SQL注入攻擊。您應該使用準備好的語句來保護您的應用程序免受SQL注入攻擊。

+0

我解決了這個問題。感謝您對這個問題表現出興趣。我現在處理keyreleased事件,並在everykeyrelease中使用文本字段的getText()方法更新serachstring。 – Deepsthecoder

0

發生這種情況是因爲您的searchString由於所添加的所有關鍵字符或退格符而受到污染。所以用

searchstring = yourTextField.getText() + ke.getKeyChar(); 

希望這有助於更換

searchstring = searchstring + ke.getKeyChar(); 

+0

我解決了這個問題。感謝您對這個問題表現出興趣。我現在處理keyreleased事件,並在everykeyrelease serachstring更新通過使用文本字段的getText()方法 – Deepsthecoder

+0

偉大...有趣的編碼:) – Sanjeev

+0

謝謝Sanjeev。你也是! :) – Deepsthecoder

0

我解決了這個問題。把我的新答案代碼放在這裏給出的答案都沒有,這個答案是完全正確的,以供將來可能面對同樣問題的其他人蔘考。 我現在處理了keyReleased事件而不是keyTyped事件。並且在每個keyrelease中,使用文本字段的getText()方法更新serachstring。 getKeyChar()會污染搜索字符串,因爲它也會跟蹤退格字符。 我使用這個邏輯的組件是使用JFC爲桌面軟件設計的組件,其工作方式類似於使用AJAX提取數據的Google搜索文本框。這裏的區別在於,這是一個桌面軟件而不是動態網頁。我在JFC中沒有找到任何這樣的內置組件。因此,我使用了JTextfield組件和awt List組件來進行收集。現在它工作得非常好。 任何批評代碼是最受歡迎的。

代碼:

 @Override 
public void keyReleased(KeyEvent ke) { 



     searchstring = enterstring.getText(); 
     char[] searcharray = searchstring.toCharArray(); 


     if(searcharray.length==0){ 

      list.setVisible(false); 

     } 
     else{ 

      list.setVisible(true); 
     } 

     System.out.println(searchstring.length()); 
    try {    
       Class.forName("com.mysql.jdbc.Driver"); 
     } catch (ClassNotFoundException ex) { 

       System.out.println(ex.toString()); 

      } 

     try { 
       Connection con = DriverManager.getConnection(url+databasename,username,password); 

       Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 

       String s = "select "+columnname+" from "+tablename+" where "+columnname+" like "+"'"+searchstring+"%"+"'"; 
       System.out.println(s); 
       list.removeAll(); 
       ResultSet rs = st.executeQuery(s); 

       while(rs.next()){ 

        System.out.println(rs.getString(1)); 
        list.add(rs.getString(1)); 
       } 

     }catch(Exception ex){ 

      System.out.println(ex.toString()); 

     } 

}