繁体   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