java数据库问题
我在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菜鸟,还望大家多指教!!谢谢!!!!!!!!!!
问题点数:50、回复次数:13Top
1 楼wqs0006(顺子)回复于 2001-05-27 10:03:00 得分 0
怎么没人回答???急!!!!!!!!!!Top
2 楼liulinliu(哦,好累)回复于 2001-05-27 10:35:00 得分 10
sql="update ever_user set ExpertGrace="+currentgrace+"whereNum="+tempnum+"";
Top
3 楼sonyStd(三好书生)回复于 2001-05-27 18:35:00 得分 30
bbs.Check里是不是用了相同的Statement?因为当Statement关闭时,相应的ResultSet也将关闭。在while里,你调用了executeUpdate();建议你看看相关的几各类。Top
4 楼wqs0006(顺子)回复于 2001-05-27 22:09:00 得分 0
但我在其它地方也也是这样用的,并没有出此问题,希望大家多多参与,回答一条我也感激不尽!!!Top
5 楼wqs0006(顺子)回复于 2001-05-28 09:26:00 得分 0
谢谢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());
}
}Top
6 楼wqs0006(顺子)回复于 2001-05-28 09:30:00 得分 0
经过测试,去掉check.executeUpdate(sql);这句,则程序通过,看来是这句出问题了。
Top
7 楼wqs0006(顺子)回复于 2001-05-28 10:29:00 得分 0
我把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);
}Top
8 楼wqs0006(顺子)回复于 2001-05-28 10:33:00 得分 0
另外,第2个问题,即:如果不想把查询结果中列相同的记录合并掉,该怎么办,我试着在sql语句中加关键字“all“,但不行!Top
9 楼skyyoung(路人甲)回复于 2001-05-28 10:59:00 得分 0
在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());
}
} Top
10 楼skyyoung(路人甲)回复于 2001-05-28 11:00:00 得分 10
提示出什么错。Top
11 楼wqs0006(顺子)回复于 2001-05-28 18:34:00 得分 0
出错信息: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);
}Top
12 楼wqs0006(顺子)回复于 2001-05-28 18:36:00 得分 0
还有,第二个问题是我自己搞错了,已经解决了,很不好意思!Top
13 楼wqs0006(顺子)回复于 2001-05-28 18:48:00 得分 0
to:skyyoung(路人甲)
TYPE_SCROLL_INSENSITIVE的ResultSet,不会显示别人做出的更改(do not show changes made by others),这具体是什么意思呢??
我不是计算机系的,基础差了点,呵呵.多指教!!Top




