各位大哥帮忙看一下这个错误:java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not re-read row data

northearthyjg 2003-08-30 03:58:00
有如下代码:
Connection conn = DBPool.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = null;
String sql = " select (select kinds_name
       "  from newsKinds where news_kind = a.news_kind)
" as kinds_name, a.* " +
" from news a order by news_pub_date desc";
rs = stmt.executeQuery(sql);
while ( rs.next() )
{
rows++;
out.println( rs.getString("news_id") );
out.prontln( rs.getString("news_name") )
}

运行,即出现标题中的错误:
  java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not re-read row data for column 1.
环境:
tomcat4.1.27 + sql server 2000 + windwos 2000 server

小弟在这里先谢谢了



...全文
199 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
2002PP 2003-08-31
  • 打赏
  • 举报
回复
应该是游标的问题.你把游标设为scroll-insensitive和scroll-sensitive试试看.
因为,默认的游标是只向前游标.
所以,你只要把两句getString语句的顺序颠倒一下就应该不会出错了.

JDBC2.1核心API提供三种结果集类型:forward-only, scroll-insensitive和scroll-sensitive。
forward-only:仅向前型。如果你仅需要前向顺序滚动结果集中的所有行,仅向前游标能提供极高的性能;然而它不能从第一行上直接滚动到最后一行,也不能从最后一行滚到第一行。
scroll-insensitive:滚动不敏感型。对于要求较高处理级别的应用来说,滚动不敏感型结果集是一个理想的选择,它支持向前和向后的记录集滚动。滚动不敏感型结果集的第一次请求是从数据库服务端取得所有满足条件的行,然后将它存储在客户端,也就是说是一个包含数据的客户端静态视图;虽然以后的操作比较快,但数据库服务器处理第一次的请求非常慢,尤其是当返回的数据量比较大时。因此,如果返回的只是一行记录我们就不应使用这种游标,使用仅向前就满足要求了;相反,如果返回的记录非常多,也不推荐使用这种游标,因为这些数据都存放在内存里,大量的数据将很快使内存耗尽。有些滚动不敏感游标的实现是将数据缓存到数据库服务器的一个临时表中,以免占用过多的内存资源。
scroll-sensitive:滚动敏感型,有时也叫键集驱动游标。它是在你的数据库上对满足条件的记录行做了一个标识,好像行的主键,当你滚动结果集的时候,只有有标识的数据才会返回。由于每次的请求都要产生一次网络连接,因此速度是很慢的。
northearthyjg 2003-08-31
  • 打赏
  • 举报
回复
klan大哥,还是不行, 在slq sever查询分析器里可以, 但还是不能同一字段取两次
northearthyjg 2003-08-31
  • 打赏
  • 举报
回复
klan
klan 2003-08-31
  • 打赏
  • 举报
回复
Connection conn = DBPool.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = null;
String sql = " select a.*,newsKinds.news_kind kinds_name
from news a left join newKinds on a.news_kind=newKinds.news_kind order by news_pub_date desc";
rs = stmt.executeQuery(sql);
while ( rs.next() )
{
rows++;
out.println( rs.getString("news_id") );
out.prontln( rs.getString("news_name") )
}
klan 2003-08-31
  • 打赏
  • 举报
回复
把你的sql改成:
select newsKinds.news_kind kinds_name,a.*
from news a left join newKinds on a.news_kind=newKinds.news_kind order by news_pub_date desc

试试
northearthyjg 2003-08-31
  • 打赏
  • 举报
回复
1。对不起啊, 下面的这个while中语句只是写了一种造成出错的情况:即只能按照顺序取字段值.
下面的while中的news_id在表结构中是排在news_name的后面, 如果换一下顺序则不出错。但还有另外的出错情况:
while ( rs.next() )
{
rows++;
out.println( rs.getString("news_id") );
out.prontln( rs.getString("news_name") )
}

2。 另外的出错情况:

while ( rs.next() )
{
rows++;
out.println( rs.getString("news_id") );
out.prontln( rs.getString("news_id") )
}
也会出错。错误就是标题中的信息。
即不能两次在一个循环中取同一字段的值。

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);也不管用



northearthyjg 2003-08-31
  • 打赏
  • 举报
回复
查询语句没有问题, 我已经在sql server 2000 里执行过了, 可以查出记录来, 不会出错
wueg2003 2003-08-30
  • 打赏
  • 举报
回复
请检查sql语句,是错误的,主语不能接子查询
zj2977 2003-08-30
  • 打赏
  • 举报
回复
查询语句有问题
northearthyjg 2003-08-30
  • 打赏
  • 举报
回复
是啊, 就是 rs.getString("news_id") 。 news_id 是 news 中的一个字段
kaibinsj 2003-08-30
  • 打赏
  • 举报
回复
rs.getString("news_id")??

81,092

社区成员

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

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