2016-02-27 62 views
0

我正在为大学做一项任务。在netbeans中使用查询访问ms访问中的数据库,这让我花了两天的时间头脑灵活地抓到目前为止。问题是,只要我打开包装并运行它,它会给我一个可爱的结果。出现此错误后:间歇结果UPDATE,DELETE,SET或GET语句:; ResultSet为空

net.ucanaccess.jdbc.UcanaccessSQLException:无效的游标状态:标识符游标未在UPDATE,DELETE,SET或GET语句中定位在行上: ResultSet是空的。

我希望你能给予任何帮助。 非常感谢。

private void FindFlghtBtnActionPerformed(java.awt.event.ActionEvent evt) {            

    try{ 

     rs = stmt.executeQuery("SELECT DepAirportTable.AirportName,    DepAirportTable.AirportDesignaton, FlightTable.DepDate,   ArrAirportTable.ArrAirportName, ArrAirportTable.ArrAirportDesignaton\n" + 
       "FROM PlaneTable INNER JOIN (ArrAirportTable INNER JOIN (DepAirportTable INNER JOIN FlightTable ON DepAirportTable.AirportDesignaton = FlightTable.FromAirDes) ON ArrAirportTable.ArrAirportDesignaton = FlightTable.ToAirDes) ON PlaneTable.FlightDesignationCode = FlightTable.[FlightDesignationCode]\n" + 
       "WHERE (((DepAirportTable.AirportName)=\""+DepCombo.getSelectedItem()+"\") AND ((FlightTable.DepDate)=#"+((JTextField)DateDep.getDateEditor().getUiComponent()).getText()+"#) AND ((ArrAirportTable.ArrAirportName)=\""+ArrComboBox.getSelectedItem()+"\"));"); 

     rs.next(); 

     { 

     departure = rs.getString("AirportName"); 
     depDate = rs.getString("DepDate"); 
     arrival = rs.getString("ArrAirportName"); 


     BookingPrevTa.setText("Your flight details are:\nDeparting from "+departure+" arriving at: "+arrival+" departing on: "+depDate); 



     rs.close(); 

     } 
    } 
    catch (SQLException ee) 
    { 
      ee.printStackTrace(); 
    } 
} 
+1

三种意见:1)为什么你必须在SQL语句中这么多括号?据我所知,你根本不需要任何东西。 2)将SQL分解成更多行,使其更易于阅读。 3)不要使用字符串连接来用用户提供的文本构建SQL语句。它会让你打开[SQL Injection](https://en.wikipedia.org/wiki/SQL_injection)攻击,允许黑客窃取你的数据和/或删除你的表。使用'PreparedStatement'和参数标记('?')。 – Andreas

+0

感谢您的帮助。至于所有来自访问的括号。我学到的SQL是针对Oracle的,Access似乎并不喜欢这样。我处于时间压力之下,所以我通过在访问设计视图中创建查询来生成sql,切换到sql视图并复制并粘贴到netbeans中。 – Javaiskillingme

回答

0

我不知道的功能{}在那里,如果他们被循环再好像你已经把rs.close()在错误的位置。我认为你应该把它放在{}之外,如果{}正在做我认为他们正在做的事情。

+0

谢谢你的帮助我非常感谢。 – Javaiskillingme

1

你的问题是你没有检查返回值next(),当它返回false时,你会得到这样的异常。

这里是您的代码的清理版本,它假定您有一个名为conn的字段的数据库连接。根据需要调整日期格式。

改进是:

  • 增加检查的next()返回值(原问题的修复)
  • 使用PreparedStatement防止SQL Injection漏洞
  • 使用的尝试,与资源的最佳资源管理,即确保资源(PreparedStatementResultSet)关闭,永不离开晃来晃去
  • Sp多行点燃语句来提高可读性在SQL语句
  • 淘汰不必要的使用括号的更简单的使用
  • 声明的所有局部变量,其中第一次使用
  • 无包装JOIN条款。新增this.现场参考,以提高透明度和防范隐藏
String sql = "SELECT DepAirportTable.AirportName" + 
        ", DepAirportTable.AirportDesignaton" + 
        ", FlightTable.DepDate" + 
        ", ArrAirportTable.ArrAirportName" + 
        ", ArrAirportTable.ArrAirportDesignaton" + 
       " FROM FlightTable" + 
       " JOIN PlaneTable ON PlaneTable.FlightDesignationCode = FlightTable.FlightDesignationCode" + 
       " JOIN DepAirportTable ON DepAirportTable.AirportDesignaton = FlightTable.FromAirDes" + 
       " JOIN ArrAirportTable ON ArrAirportTable.ArrAirportDesignaton = FlightTable.ToAirDes" + 
      " WHERE DepAirportTable.AirportName = ?" + 
       " AND FlightTable.DepDate = ?" + 
       " AND ArrAirportTable.ArrAirportName = ?"; 
try (PreparedStatement stmt = this.conn.prepareStatement(sql)) { 
    String dateStr = ((JTextField)DateDep.getDateEditor().getUiComponent()).getText(); 
    java.util.Date date = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr); 
    stmt.setString(1, DepCombo.getSelectedItem()); 
    stmt.setDate (2, new java.sql.Date(date.getTime())); 
    stmt.setString(3, ArrComboBox.getSelectedItem()); 
    try (ResultSet rs = stmt.executeQuery()) { 
     if (rs.next()) { 
      String departure = rs.getString("AirportName"); 
      String depDate = rs.getString("DepDate"); 
      String arrival = rs.getString("ArrAirportName"); 
      BookingPrevTa.setText("Your flight details are:\n" + 
            "Departing from " + departure + 
            " arriving at: " + arrival + 
            " departing on: " + depDate); 
     } 
    } 
} 
+0

不错的工作,一如既往。然而,在AND AND FlightTable.DepDate =#“++”#“'的查询中似乎存在一个拼写错误。如果您为什么应该使用try-with-resources语句添加一些动机,那么您将获得我的投票。:) –

+1

@MickMnemonic这更好? – Andreas

+0

非常感谢您的帮助人员。我非常感激。每天都是学生。 – Javaiskillingme