使用 group by 子句后的ResultSet的问题!!

zixinyin 2007-08-14 07:40:41
数据库(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里执行结果完全正确
...全文
739 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
joejoe1991 2007-08-16
  • 打赏
  • 举报
回复
不知道 等待牛人
zixinyin 2007-08-16
  • 打赏
  • 举报
回复
谢谢各位捧场,不过我的关键问题不是要得到rs里边的总数是多少,而是这个循环在输出179个正确答案后会抛出异常: [Microsoft][ODBC 驱动程序管理器] 无效的游标状态

while(rs.next())
{
String phone=rs.getString("times");
System.out.println(phone);
}
我百思不得其解,才加了一段代码,看看rs的size是多少,结果发现是8000多,后来我把rs.next() 改成 !rs.isLast()结果还是异常。
刚刚把sql server 配置好了,马上试下
Rolf已存在 2007-08-16
  • 打赏
  • 举报
回复
getRow(); rs.last(); rs.beforeFirst();这几个方法是要根据不同的数据库、driver或者数据库中游标和锁来决定是否能使用的,我印象里好像oracle可以对这几个方法完全支持,其他数据库一般要看情况了。
你要得到总记录数,我建议你最好把数据集用循环+1的方法来实现吧
zixinyin 2007-08-16
  • 打赏
  • 举报
回复
我大大的一滴汗! 果然是access的问题,我用SQL SERVER就没有问题了
Rolf已存在 2007-08-15
  • 打赏
  • 举报
回复
jdbcodbcdriver好象不支持rs.last()和rs.beforeFirst()方法吧,

你在创建stmt时,这样创建
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

然后再试一下
zixinyin 2007-08-15
  • 打赏
  • 举报
回复
在java里使用 group by 语句有什么需要注意的吗?
请有经验的朋友提醒下呢~
zixinyin 2007-08-15
  • 打赏
  • 举报
回复
不是debug,就是下面3句语句。
int size = rs.getRow(); // 取得记录数,注意这里!!!!
rs.beforeFirst();
System.out.println("TIMES"+size); //!!!!!!!!!!
最诡异的问题是那个 while(rs.next())循环会抛出异常,当显示了179个记录以后。
感觉就是rs里边实际只有179个记录,但是他自己认为自己有8000多个
axia6395 2007-08-15
  • 打赏
  • 举报
回复
应当不是的 应当返回的就是一条
supermanyan10 2007-08-15
  • 打赏
  • 举报
回复
你是debug的时候看到8000多的吧?
估计是你rs没关造成的
不过其他都是空的,不要紧的吧
zixinyin 2007-08-15
  • 打赏
  • 举报
回复
按楼上的做了,数量:179
晕死~~~ 那个8000多怎么搞得阿
Davis129 2007-08-15
  • 打赏
  • 举报
回复
刚没看清楚 既然有异常 那就有问题 那上面的话就不是这样说了 害我想来想去的
Davis129 2007-08-15
  • 打赏
  • 举报
回复
既然编译和输出结果都没有提示出错 那就是对的
既然是对的那就找为什么 而不是找方法改变它 你要想看不见8000 把那输出删掉就OK

你要得到记录数 循环完了 rs.getRow()就是你的记录数

也许说明了你这种方法取记录数是不可取的 至少当group by时

group by时 它数据库里相关记录数还是8000多 它先开了这么大的空间 然后把你要的结果记录处理后也存在了同一空间里 所以 rs.last()指向了空间的末尾 而不是你想要的记录数末尾

上面的只是猜想和一种可能
孟子E章 2007-08-15
  • 打赏
  • 举报
回复
int num = 0;
while(rs.next())
{
String phone=rs.getString("times");
System.out.println(phone);
num++;
}

System.out.println("数量:" + num);
zixinyin 2007-08-15
  • 打赏
  • 举报
回复
唉 朋友说可能是access的问题,马上换个sql server 看看
zixinyin 2007-08-15
  • 打赏
  • 举报
回复
8000多是总记录数,难道我在sql语句中使用了group by 还会返回8000多条记录吗?
奋斗并快乐着 2007-08-15
  • 打赏
  • 举报
回复
mark
zixinyin 2007-08-15
  • 打赏
  • 举报
回复
按楼上的做了 没有变化,我原来第二个参数 是 concur_updatable
cyangmiao 2007-08-14
  • 打赏
  • 举报
回复
楼主是不是rs没关闭啊。
Davis129 2007-08-14
  • 打赏
  • 举报
回复
在循环完的时候 也可以查看rs.isLast() 是true 还是false
Davis129 2007-08-14
  • 打赏
  • 举报
回复
你在循环里输出rs的行号看看

while(rs.next())
{
...
System.out.println(rs.getRow());
}

那个8000多是不是跟表的总记录数相同,或许开了8000多记录的空间,存取了179记录
如果这样rs.last()应该返回false
加载更多回复(1)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧