簡體   English   中英

結果集(java.sql)對象一次生成結果集后不獲取數據

[英]Resultset(java.sql) object doesn't fetch data after generating resultset once

我正在制作一個具有文本字段和列表的組件,其中將偵聽文本字段中的鍵入,並因此生成結果集並將其添加到列表中。 當我擦除鍵入的鍵並鍵入新的鍵時,它不起作用。 不會再次相應地獲取結果集。 該怎么辦?

碼:

    @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());

        }



}

您不斷在搜索字符串后附加鍵入的字符:

searchstring = searchstring + ke.getKeyChar();

由於此搜索會隨着您鍵入的內容而不斷變化-鍵入時都使用退格鍵刪除該字段。 最后,搜索searchstring將不匹配數據庫中的任何內容。 這就是為什么列表不變的原因!

無需修改searchstring ,而是創建另一個用於附加鍵char的變量,然后在查詢的where子句中使用該值。

注意:這種將用戶輸入附加到查詢的方式為SQL注入攻擊打開了您的應用程序。 您應該使用准備好的語句來保護您的應用程序免受SQL注入攻擊。

這是因為您的searchString由於要添加到其中的所有鍵字符或退格鍵而受到污染。 所以更換

searchstring = searchstring + ke.getKeyChar();

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

希望這可以幫助。

我解決了這個問題。將我的新答案代碼發布為該答案之前此處給出的所有答案均不完全正確,僅供以后可能遇到相同問題的其他人參考。 現在,我處理了keyReleased事件而不是keyTyped事件 並且在每次按鍵釋放時,都通過使用textfield的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());

        }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM