通过Java进行SQL查询,“对空结果集进行非法操作”

时间:2011-05-13 02:58:47

标签: java jdbc

我正在进行如下的数据库调用:

String sqlAlert = "SELECT * FROM demotable where demo_no ='"
                                +rsDemo.getString("demo_no") + "'";

ResultSet rsAlert = db.GetSQL(sqlAlert);

        if (rsAlert.next()) { 

            String newAlert = rsAlert.getString("cust3")+"1";

            String newAlertSql = "UPDATE demotable SET cust3 = '" + newAlert + "' where demo_no='" + rsDemo.getString("demo_no") + "'";
            System.out.println("Update alert msg: " + newAlertSql);
            db.RunSQL(newAlertSql);
        }  else {
            System.out.println("empty result. Demo_no = "+rsDemo.getString("demo_no"));
               String sqlAlertinsert = "INSERT INTO demotable VALUES('" + rsDemo.getString("demo_no") + "','','','','','<unotes></unotes>')";
              db.RunSQL(sqlAlertinsert);
              System.out.println("insert demo done");

              String sqlAlert2 = "SELECT * FROM demotable where demo_no ='"rsDemo.getString("demo_no") + "'";
              ResultSet rsAlert2 = db.GetSQL(sqlAlert2);

            if (rsAlert2.next()) {

                String newAlert = rsAlert2.getString("cust3")+"1";

                String newAlertSql = "UPDATE demotable SET cust3 = '" + newAlert+ "' where demo_no='" + rsDemo.getString("demo_no") + "'";
                              System.out.println("Update alert msg: " + newAlertSql);
                         db.RunSQL(newAlertSql);
            }
            rsAlert2.close(); 

        }

rsAlert.close();

rs.close();

如果rsAlert返回一个空集,然后从中访问值,我试图将行插入到demographiccust中。但我的代码在“if(rsAlert2.next()){”周围返回此异常“空结果集上的非法操作”。为什么即使在将值插入表中后它也返回空集?请帮忙。谢谢。

2 个答案:

答案 0 :(得分:2)

可能是因为打开了光标。在尝试第二个之前,您必须关闭第一个StatementResultSet是一个关联的东西,当你关闭Statement它也会被关闭。我看不到您的db.RunSQL()db.GetSQL()方法的实施情况。

但是,我首先要提出你应该如何做的建议。你去吧,

  1. 在不查询数据库的情况下更新它
  2. 检查更新的行数。如果没有,则执行步骤3,否则完成
  3. 首先插入具有正确值的记录。插入后无需更新。
  4. 提示:

    1. 尝试使用PreparedStatement,而不是
    2. 尽量坚持使用Java Naming Convention
    3. 尝试使用有意义的名称,例如,您的方法db.GetSQL()不会返回SQL,而是反过来询问一个,实际上返回ResultSet
    4. 永远不要返回ResultSet。这可能会导致代码膨胀和许多开放游标。不要让您的方法的用户关闭它。在您执行任何数据库查询的方法中自己关闭它,并将结果作为bean或bean列表返回。

答案 1 :(得分:1)

这只是猜测,但是因为您直接将rsDemo.getString("demo_no")插入到SQL中,所以您可能传递的SQL语句不是您想要的。尝试使用参数绑定api。