2014-02-17 45 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()); 

     } 

}