java数据库问题

wqs0006 2001-05-26 09:41:00
我在jsp文件中用到了ResultSet,但是存在以下问题
1。用过rs后,执行rs.close()则出现错误:rs is closed
2。我不想让rs把完全相同的纪录合并,故在sql语句中加了关键字“all”,单ResultSet好像不支持all,相同纪录还是合并了
3。当while(i<=answernum&&rs.next())中,i<=answernum是true,但rs.next())是false时,出现如下错误:rs is closed

源代码如下:
<%@page contentType="text/html;charset=gb2312" %>
<%@page import="java.io.*,java.sql.*,java.util.*" %>
<jsp:useBean id="check" scope="page" class="bbs.Check" />
<%
sql="select * from ever_user where UID in (select Author from answer where QuestionID="+num+")";
rs=check.executeQuery(sql);
int tempnum=0;
int i=1;
while(i<=answernum&&rs.next())
{
tempnum=rs.getInt("Num");
currentgrace=rs.getInt("ExpertGrace");
currentgrace=currentgrace+intgrace[i];
sql="update ever_user set ExpertGrace="+currentgrace+"whereNum="+tempnum;
check.executeUpdate(sql);
i++;
}
rs.close()//加上此句则出错
%>

本人乃java菜鸟,还望大家多指教!!谢谢!!!!!!!!!!
...全文
96 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
skyyoung 2001-05-28
提示出什么错。
回复
skyyoung 2001-05-28
在UPDATE
不用ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE
试试

public void executeUpdate(String sql)
{
try
{
if(conn!=null)
conn.close() ;
conn=DriverManager.getConnection(sConnStr);
Statement stmt=conn.createStatement() ;
stmt.executeUpdate(sql);
conn.commit() ;
}
catch(SQLException ex)
{
System.out.println("check.executeUpdate:"+ex.getMessage());
}
}
回复
wqs0006 2001-05-28
另外,第2个问题,即:如果不想把查询结果中列相同的记录合并掉,该怎么办,我试着在sql语句中加关键字“all“,但不行!
回复
wqs0006 2001-05-28
我把executeQuery()中的stmt改为stmt1,在把executeUpdate中的stmt改为stmt2,但问题依然存在,我现在用下面的方法把问题解决了,但我还是希望大家能继续讨论此问题!!!!

while(rs.next()&&i<=answernum)
{
tempnum[i]=new Integer(rs.getInt("Num"));
currentgrace[i]=new Integer(rs.getInt("ExpertGrace"));
currentgrace[i]=new Integer(currentgrace[i].intValue()+intgrace[i]);
i++;
}
rs.close();
for(i=1;i<=answernum;i++)
{
sql="update ever_user set ExpertGrace="+currentgrace[i].intValue()+" where Num="+tempnum[i].intValue();
check.executeUpdate(sql);
}
回复
wqs0006 2001-05-28
经过测试,去掉check.executeUpdate(sql);这句,则程序通过,看来是这句出问题了。
回复
wqs0006 2001-05-28
谢谢sonyStd(三好书生)
我在bbs.Check中的executeQuery和executeUpdate方法中并没使用相同的statement
代码如下:
public ResultSet executeQuery(String sql)
{
rs=null;
try
{
if(conn!=null)
conn.close();
conn=DriverManager.getConnection(sConnStr);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs=stmt.executeQuery(sql);
}
catch(SQLException ex)
{
System.err.println("check.executeQuery:"+ex.getMessage() );
}
return rs;
}


public void executeUpdate(String sql)
{
try
{
if(conn!=null)
conn.close() ;
conn=DriverManager.getConnection(sConnStr);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE) ;
stmt.executeUpdate(sql);
conn.commit() ;
}
catch(SQLException ex)
{
System.out.println("check.executeUpdate:"+ex.getMessage());
}
}
回复
wqs0006 2001-05-28
to:skyyoung(路人甲)
TYPE_SCROLL_INSENSITIVE的ResultSet,不会显示别人做出的更改(do not show changes made by others),这具体是什么意思呢??
我不是计算机系的,基础差了点,呵呵.多指教!!
回复
wqs0006 2001-05-28
还有,第二个问题是我自己搞错了,已经解决了,很不好意思!
回复
wqs0006 2001-05-28
出错信息:rs is closed

我想是因为:executeQuery和executeUpdate用的是同一个Connection.当执行check.executeUpdate(sql);后,rs失去了Connection,rs被关掉了,所以当循环到第二次时,产生出错信息。这个问题我已通过下面的代码解决,也就是把executeUpdate从while循环中提出来:


while(rs.next()&&i<=answernum)
{
tempnum[i]=new Integer(rs.getInt("Num"));
currentgrace[i]=new Integer(rs.getInt("ExpertGrace"));
currentgrace[i]=new Integer(currentgrace[i].intValue()+intgrace[i]);
}
for(i=1;i<=answernum;i++)
{
sql="update ever_user set ExpertGrace="+currentgrace[i].intValue()+" where Num="+tempnum[i].intValue();
check.executeUpdate(sql);
}
回复
liulinliu 2001-05-27
sql="update ever_user set ExpertGrace="+currentgrace+"whereNum="+tempnum+"";
回复
wqs0006 2001-05-27
但我在其它地方也也是这样用的,并没有出此问题,希望大家多多参与,回答一条我也感激不尽!!!
回复
wqs0006 2001-05-27
怎么没人回答???急!!!!!!!!!!
回复
sonyStd 2001-05-27
bbs.Check里是不是用了相同的Statement?因为当Statement关闭时,相应的ResultSet也将关闭。在while里,你调用了executeUpdate();建议你看看相关的几各类。
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2001-05-26 09:41
社区公告
暂无公告