日期:2014-05-20  浏览次数:20736 次

使用 group by 子句后的ResultSet的问题!!
数据库(ACCESS)中有许多电话号码,我要统计每个号码出现多少次,在Java中写代码:
  String   sql= "select   count(phone)   as   times "   +
                                "   from   yzx     group   by   [phone]   ";
                DBManager   db=new   DBManager(DBManager.JDBC_ODBC_DRIVER);//这个类是自己写的,为了方便,就是连接数据库,创立statement
                  try
                {
                      db.openDatabase( "jdbc:odbc:phone ");
                      ResultSet   rs=db.executeSQL(sql);
                      rs.last();  
                      int   size   =   rs.getRow();   //   取得记录数,注意这里!!!!
                        rs.beforeFirst();        
                        System.out.println( "TIMES "+size);   //!!!!!!!!!!
                      while(rs.next())
                      {
                              String   phone=rs.getString( "times ");
                              System.out.println(phone);
                      }

                  }
                  catch(Exception   e)
                  {
                          System.out.println(e.getMessage());
                  }
      }
输出的结果是正确的,一共有179个不同的号码,所以是179个数字,但是ResultSet的size却是8000多,于是,最后在while(rs.next())抛出了异常:
[Microsoft][ODBC   驱动程序管理器]   无效的游标状态

太奇怪了,为什么resultset的size没有按照phone归类阿??!!
PS:上面那句sql语句在access里执行结果完全正确


------解决方案--------------------
在循环完的时候 也可以查看rs.isLast() 是true 还是false

------解决方案--------------------
getRow(); rs.last(); rs.beforeFirst();这几个方法是要根据不同的数据库、driver或者数据库中游标和锁来决定是否能使用的,我印象里好像oracle可以对这几个方法完全支持,其他数据库一般要看情况了。
你要得到总记录数,我建议你最好把数据集用循环+1的方法来实现吧