关于Mysql和JAVA的代码有什么问题

时间:2015-04-24 19:31:23

标签: java mysql

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {        
ConnectionDTB cdtb = new ConnectionDTB();

ResultSet rs = cdtb.retrieveData("select svcode from listSV");
if(!rs.isBeforeFirst()){
        System.out.println("System is null");
        //add
        cdtb.close();
    }
else{
    while(rs.next()){
        if(Integer.parseInt(jTextField1.getText()) == rs.getInt("svcode")){       
            System.out.println("ERROR");
            cdtb.close();
            break;
        }
        else{
            if(rs.isLast()){
                //add
                cdtb.close();
            }else{
                cdtb.close();
        }
 }

我的错误是

  

2015年4月25日上午2:21:29 GUI.m1 jButton1ActionPerformed   严重:空   java.sql.SQLException:ResultSet关闭后不允许操作

我做错了什么?

3 个答案:

答案 0 :(得分:1)

在完成结果集之前,您似乎正在关闭循环内的数据库连接。

如果仍在使用与数据库连接关联的语句或结果集,则无法关闭数据库连接。 (嗯,你可以这样做,但关闭连接也会关闭结果集,你会得到你观察到的那种行为。)

规范模式是使用 try / catch / finally 块,并关闭finally块中的结果集,语句和连接。

例如:

ConnectionDTB cdtb = null;
ResultSet rs = null;

try {

   cdtb = new ConnectionDTB();
   rs = cdtb.retrieveData("select svcode from listSV");

   while(rs.next()){
       // whatever processing you need to do on each row, but
       // do NOT close the result set here
       // do NOT close the database connection here!
   }

} catch (SQLException ex) {
    // anything you want to do if an exception is thrown
} finally {
    if (rs != null) {
        try { rs.close(); } catch (SQLException e) { /*ignore*/ }
    }
    if (cdtb != null) {
        try { cdtb.close(); } catch (SQLException e) { /*ignore*/ }
    }
}

可以简化finally块,删除不必要的try / catch。这也没关系:

} finally {
    if (rs != null) {
        rs.close();
    }
    if (cdtb != null) {
        cdtb.close();
    }
}

这里重要的是在“finally”块中进行关闭,这样即使发生异常也会运行。使用这种模式,数据库连接有一个“关闭”,而不是通过代码分散的多个调用。

其他一些说明:

如果您的代码尚不存在,那么您的代码似乎意味着“添加”一行。这是一个很大的开销,从数据库中撤回每个值并检查它。

询问数据库是否存在这样的行会更有效。要询问数据库是否存在这样的行,请使用如下语句:

SELECT svcode FROM listSV WHERE svcode = ?

准备语句,将值绑定到占位符(您要查找的值),然后执行该语句,并检查是否返回了一行。

如果您正在执行此检查以查看是否需要将行添加到listSV表,您实际上可以使用单个INSERT ... SELECT语句来有条件地插入行。

答案 1 :(得分:0)

虽然我不认为它实际上是根据提供的信息显示的,但我认为您正在关闭结果集(在这种情况下' rs')然后再次尝试运行操作。

如果我不得不猜测,我会说取出rs.close,因为它过早地关闭了结果集。如果你想继续阅读同一套,也许可以用继续替换?

答案 2 :(得分:0)

  private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {        
  ConnectionDTB cdtb = new ConnectionDTB();

  ResultSet rs = cdtb.retrieveData("select svcode from listSV");
  if(!rs.isBeforeFirst()){
        System.out.println("System is null");
        //add
        cdtb.close();
        rs.close();
    }
    else{
    while(rs.next()){
        if(Integer.parseInt(jTextField1.getText()) == rs.getInt("svcode")){       
            System.out.println("ERROR");
            cdtb.close();
            rs.close();
            break;
        }
        else{
            if(rs.isLast()){
                //add
                cdtb.close();
                rs.close();
            }
      }

这是对的吗? 顺便告诉我AfterLast的意思吗?