如何得到第二个结果集

dell_note 2010-10-28 05:25:54
ResultSet rs = null;
String sql = "select * from A; select * from B";

stmt.execute(sql);
rs = stmt.getResultSet();
//这是得到了默认的第一个结果集;
while(rs.next()){
...
}


//这样写得到第二个结果集,怎么不对?应该怎样写?
stmt.getMoreResults();
//stmt.getMoreResults(1); //这样写也不对;
rs = stmt.getResultSet();
while(rs.next()){
...
}
...全文
239 点赞 收藏 37
写回复
37 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dell_note 2010-11-08
[Quote=引用 32 楼 chdw 的回复:]
唉,你根本没有看文档吧!


Parameters:
current - one of the following Statement constants indicating what should happen to current ResultSet objects obtained using the method getResultSet: Statement.CLOSE_CUR……
[/Quote]


如何取第二个结果集的方法已解决。

现在问题是如果将结果集的类型设为:TYPE_SCROLL_INSENSITIVE;
只所以要用这个类型是因为可以用 isBeforeFirst() 方法来判断是否有记录;
回复
ChDw 2010-11-08
判断有记录直接用rs.next()就足够啦,例如

boolean hasResult = rs.next();
if(hasResult) {
do {
rs.getString(1);
} while(rs.next());
} else {
//No Result
}
回复
dell_note 2010-11-06
[Quote=引用 33 楼 chdw 的回复:]
如果你只想获取第二个结果集,你自己弄个计数变量int index,在if(hasRs)中index++,如果等于你想要的你再取这个ResultSet对象操作

不过我真想说,执行多个SQL语句代码都清晰多了吧,一般别用这么复杂的写法吧。
[/Quote]


[color=#FF0000]如何取第二个结果集的方法已解决。[/color]

现在问题是如果将结果集的类型设为:TYPE_SCROLL_INSENSITIVE;
只所以要用这个类型是因为可以用 isBeforeFirst() 方法来判断是否有记录;
回复
stl0 2010-11-05
resultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY只是对结果的游标可不可移动来说的吧,跟查询语句的left join有关系么,不好意思,这方面不是很清楚。。

好像含有join或者group by的查询语句不可以对结果集resultset进行更新
回复
dell_note 2010-11-05
[Quote=引用 20 楼 stl0 的回复:]
getMoreResults返回值是个boolean。。。

Java code

while(stmt.getMoreResults()){
resultSet = stmt.getResultSet();
while(resultSet.next()){
....
}
}
[/Quote]


明白怎么用了,谢谢!

还想问你一个问题:
如果结果集用了ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY这种类型是不是就不能在SQL 语句里使用 LEFT JOIN 语句了?
如果使用了,在子表里没有数据的话,主表的内容就为空。
回复
hbu_zhy 2010-11-05
还真没有像你那么用过,学习了。
回复
stl0 2010-11-05
getMoreResults返回值是个boolean。。。

while(stmt.getMoreResults()){
resultSet = stmt.getResultSet();
while(resultSet.next()){
....
}
}
回复
dell_note 2010-11-05
大家都没有人用过execute() ; getMoreResults()这两个方法?
回复
makeboluo0000 2010-11-05
我来看啊看你
回复
ChDw 2010-11-05
如果你只想获取第二个结果集,你自己弄个计数变量int index,在if(hasRs)中index++,如果等于你想要的你再取这个ResultSet对象操作

不过我真想说,执行多个SQL语句代码都清晰多了吧,一般别用这么复杂的写法吧。
回复
ChDw 2010-11-05
唉,你根本没有看文档吧!


Parameters:
current - one of the following Statement constants indicating what should happen to current ResultSet objects obtained using the method getResultSet: Statement.CLOSE_CURRENT_RESULT, Statement.KEEP_CURRENT_RESULT, or Statement.CLOSE_ALL_RESULTS


清楚说明了这个参数的作用啊!它表达的只是是否需要关闭之前已经获取的结果集而已。

我那个while循环应该可以获取所有结果集啊,有问题吗?
回复
sxww321 2010-11-05
学习了,还真没这么用过。
回复
dell_note 2010-11-05
[Quote=引用 27 楼 chdw 的回复:]
其实要获取所有的结果集应该是这样的

boolean hasRs = stat.execute(sql);
while(hasRs || stat.getUpdateCount() >= 0) {
if(hasRs)
rs = stat.getResult();
hasRs = stat.getMoreResults();
}

因为如果你有三个语句,分别是selec……
[/Quote]


getMoreResults(int current) ; 这个里的参数应该如何使用;
getMoreResults(0);getMoreResults(1)都不对?
回复
dell_note 2010-11-05
[Quote=引用 28 楼 chdw 的回复:]
Java code
boolean hasRs = stat.execute(sql);
while(hasRs || stat.getUpdateCount() >= 0) {
if(hasRs) {
rs = stat.getResult();
//read from rs
}
hasRs = stat.getMoreResults();
}

……
[/Quote]


获取多个结果集的方法我已学会,现在的问题是如果设置了结果集的类型,它就报错,如何解决?

将结果集设为TYPE_SCROLL_INSENSITIVE;
如果设置了结果集的类型,它提示"该语句没有游标名称,提取类型为 2"是怎么回事?这是执行一个存储过程时报错。执行一个返回多个结果集的查询语句时也报错,但不是这个提示。
回复
ChDw 2010-11-05
boolean hasRs = stat.execute(sql);
while(hasRs || stat.getUpdateCount() >= 0) {
if(hasRs) {
rs = stat.getResult();
//read from rs
}
hasRs = stat.getMoreResults();
}



其实这个才是完整的获取所有结果集的方法,只不过通常我们很少这样用(也不是所有数据库支持多个结果集)
回复
ChDw 2010-11-05
其实要获取所有的结果集应该是这样的

boolean hasRs = stat.execute(sql);
while(hasRs || stat.getUpdateCount() >= 0) {
if(hasRs)
rs = stat.getResult();
hasRs = stat.getMoreResults();
}

因为如果你有三个语句,分别是select、update、select的
那么stat.execute首先返回true,
然后调用getMoreResults问第二条语句是否有结果集,返回false,但是这个时候getUpdateCount()会返回非负整数
然后再调用getMoreResults问第三条语句是否有结果集,返回true
回复
dell_note 2010-11-05
[Quote=引用 24 楼 stl0 的回复:]
resultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY只是对结果的游标可不可移动来说的吧,跟查询语句的left join有关系么,不好意思,这方面不是很清楚。。

好像含有join或者group by的查询语句不可以对结果集resultset进行更新
[/Quote]


这个问题也算是解决了。将TYPE_SCROLL_SENSITIVE改为TYPE_SCROLL_INSENSITIVE。

还是再问你getMoreResults();getResultSet()问题,
如果设置了结果集的类型,它提示"该语句没有游标名称,提取类型为 2"是怎么回事?这是执行一个存储过程时报错。执行一个返回多个结果集的查询语句时也报错,但不是这个提示。
回复
noaso 2010-11-05
我咋没听说还能这样查
回复
dell_note 2010-11-03
大家都没有人用过execute() ; getMoreResults()这两个方法?
回复
crecrecre 2010-11-02
顶顶顶顶顶顶顶顶
回复
加载更多回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2010-10-28 05:25
社区公告
暂无公告