【问题标题】:Throw exception result set closed抛出异常结果集关闭
【发布时间】:2015-12-29 17:17:43
【问题描述】:

这是一个登录表单 此代码抛出异常结果集已关闭...为什么 rs 不包含表? 在我添加 > 总是打印磨损的用户名或密码

我该如何解决?

*preparedstatement 对代码没有影响

代码:

final JButton btnNewButton = new JButton("Log in");
    btnNewButton.addActionListener(new ActionListener() {
        @SuppressWarnings("deprecation")
        public void actionPerformed(ActionEvent arg0) {

            String password=passwordField.getPassword().toString();
            String UserName = textField_1.getText().toString();
            try
            {
                Class.forName("org.sqlite.JDBC");   
                Connection con=DriverManager.getConnection("jdbc:sqlite:C:\\Users\\max\\Desktop\\javaproject\\hotel");
                String sqlcheck="select * from login where  login.Name ='"+UserName+"'and login.password='"+password+"'";
                Statement s =con.createStatement();
                ResultSet rs=s.executeQuery(sqlcheck);
                String rsusername=rs.getString("name");
                String rspassword=rs.getString("password");

                if(rs.next())
                {

                btnNewButton.addMouseListener(new MouseAdapter() {
                    @Override
                        public void mouseClicked(MouseEvent arg0) {
                            Hotel1 hotel=new Hotel1();
                            hotel.setVisible(true);
                }
            });

                }
                 else
                   JOptionPane.showMessageDialog(null, "worng user name or password");
            }
            catch(ClassNotFoundException | SQLException e)
            {
                JOptionPane.showMessageDialog(null, "class not found exception"+e);
            }

【问题讨论】:

  • 您需要调用rs.next() 来获取第一个值。我猜没有第一个值,这就是您收到错误的原因。您在哪里关闭 ResultSet、Statement 和 Connection 资源? (除非你这样做,否则会有内存泄漏)
  • 当我在 sqlite 中执行此查询时确定 .... 检索值

标签: java jdbc


【解决方案1】:

您需要像这样向上调用 rs.next:

if (rs.next ()) { 
   String rsusername=rs.getString("name"); 
   String rspassword=rs.getString("password"); 

试试这样:

    String sqlcheck=
             "select * from login where"
             + " login.Name = ?  and login.password=? ";
    try(PreparedStatement s =con.prepareStatement(sqlcheck)) {
      s.setString(1 , UserName);
      s.setString(2, password);
      try(ResultSet rs=s.executeQuery()) {
          if(rs.next()) {
            String rsusername=rs.getString("name");
            String rspassword=rs.getString("password");
            btnNewButton.addMouseListener(new MouseAdapter() {
              @Override
                  public void mouseClicked(MouseEvent arg0) {
                      Hotel1 hotel=new Hotel1();
                      hotel.setVisible(true);
                  }
             });
          } else {
             JOptionPane.showMessageDialog(null, "worng user name or password");
          }
      }
    } catch(ClassNotFoundException | SQLException e) {
        JOptionPane.showMessageDialog(null, "class not found exception"+e);
    }

【讨论】:

  • 我移动它但它没有进入(if 语句)打印“wearg 用户名或密码”
  • 那么没有匹配的用户 - 选择不返回任何行。
  • 在没有 where 的情况下尝试一次(只需从用户中选择 *),直到该代码工作 - 然后完成 sql 进行登录检查。也许你想去那里的 PreparedStatement?
  • 工作直到我在哪里写 ((login.password='"+password+"')).......当我使用 PreparedStatement 时它抛出异常 PreparedStatement not supported (在我写密码之后= ...等)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2012-01-21
  • 2014-01-17
  • 2011-12-10
相关资源
最近更新 更多