while (rs.next()) 的问题!!一个经常遇到但却被人忽略的问题!!

iiifei 2005-04-21 06:05:50
以下是一个程中的run函数,
其中要求是当记录集为空时,就跳出while循环,你们看我这样做对吗?
主要是设置isNull的值的问题,如果rs为空就让isNull = true,否则就是false,
然后继续循环rs。

你们看看我这样做对吗???


public void run() {
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
ResultSet rs = conn.exeQuery(sql);
while (!isNull) {
try {
while (rs.next()) {
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
isNull = false;
}
} catch (SQLException e) {
isNull = true;
e.printStackTrace();
}
}
}


谢谢!!!!
...全文
2211 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
narilee 2005-05-16
  • 打赏
  • 举报
回复
Marks
iiifei 2005-05-16
  • 打赏
  • 举报
回复
对不去,我出差刚回来 :)
我这里想实现的是一个共享资源模型!!
就是一个线程负责向共享资源里放置数据;另一个线程则同步地读取共享资源里的数据!!
上面的只是把数据放到共享资源里了,而当另一个线程读取时则需要判断一下共享资源里是否有数据!!
所以还是要用到一个参数的(此处是isNull),请问大家该怎么做???

非常感谢!!!
ChDw 2005-04-22
  • 打赏
  • 举报
回复
我上面也说了最常用的是
while(rs.next()){
System.out.print(rs.getString(1));
}

主要是因为有些时候在记录集一条记录都没有的时候需要做一些额外的提示(可能弹出一个窗口说没有找到任何记录的样子)的话,我那种方法写起来比较简洁一些
nelson1983 2005-04-22
  • 打赏
  • 举报
回复
if(rs.next()) {
do {
System.out.println(rs.getString(1));
}while(rs.next());
} else {
Empty ResultSet
}
是个不错的方法
不过常用的方法是
try{
while(rs.next()){
System.out.print(rs.getString(1));
}
}
catch(SQLException SQLE)
{e.printStackTrace();}
楼主的isNULL好象没什么用,因为当rs为空时,rs.next()就会返回flase
ChDw 2005-04-22
  • 打赏
  • 举报
回复
if(rs.next()) {
do {
System.out.println(rs.getString(1));
}while(rs.next());
} else {
Empty ResultSet
}


这种方法当然可以取得第一行!
因为我在调用了第一次rs.next()之后马上进入do循环,这个时候rs.getString(1)取得的就是第一行记录!!!!!!!!


这个是判断记录集是不是空的一个好方法!!!
马行空牛耕田 2005-04-22
  • 打赏
  • 举报
回复
sorry,修正一下:
4、要判断rs的结果是否为空,只要使用一次rs.next方法就行了,如果它返回为false,则证明rs的结果为null
马行空牛耕田 2005-04-22
  • 打赏
  • 举报
回复
好像简单的事情搞复杂了,首先明确几点:
1、rs = stmt.exeQuery(sql)后,rs肯定不会为null,注意,是rs对象不会为null,而不是其包含的result
2、既然rs不会为null,所以在rs = stmt.exeQuery(sql)后,使用while(rs.next())或者if(rs.next())时就不用判断rs != null;
3、rs.next时,游标最先是指向第一条记录前的位置,所以第一次rs.next后,游标指向的正好是第一条记录(如果有的话)
4、要判断rs的结果是否为空,只要使用一次rs.next方法就行了,如果它返回为null,则证明rs的结果为null
所以最终的代码可以写为:
public void run() {
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
ResultSet rs = conn.exeQuery(sql);
//while (!isNull) {
try {
while (rs.next()) {
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
//isNull = false;
}
} catch (SQLException e) {
//isNull = true;
e.printStackTrace();
}
//}
}
topil 2005-04-22
  • 打赏
  • 举报
回复
public void run() {
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
ResultSet rs = conn.exeQuery(sql);
try {
while (rs.next()) {
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
isNull = false;
}
} catch (SQLException e) {
isNull = true;
e.printStackTrace();
}
}
ipv 2005-04-22
  • 打赏
  • 举报
回复
public void run() {
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
try {//范围扩大,万一查询错误呢
ResultSet rs = conn.exeQuery(sql);
if(rs!=null){//判断是不是空
while (rs.next()) {
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
}
} catch (Exception e) {//不对异常处理,不用特别捕捉阿
e.printStackTrace();
}

}
}
wolf198268 2005-04-22
  • 打赏
  • 举报
回复
楼上的弟兄已经说了,有一个while(rs.next())就可以了,用isNull是多此一举
sinolpc 2005-04-22
  • 打赏
  • 举报
回复
死循环
jihanzhong 2005-04-22
  • 打赏
  • 举报
回复
楼住这样会陷入死循环
jihanzhong 2005-04-22
  • 打赏
  • 举报
回复
楼住把catch里的 isNull = true;提到try上就可以了

不用改很多
kk2486 2005-04-22
  • 打赏
  • 举报
回复
多此一举
ChDw 2005-04-22
  • 打赏
  • 举报
回复
当然不是完全是多余的,我都说了最常用的当然是只需要一个while,

但是有些时候如果结果集是空白的,可能需要提示用户没有结果,如:
if(rs.next()) {
do {
out.println("Name:" + rs.getString(1));
}while(rs.next());
} else {
out.println("没有找到匹配的用户");
}

如果你直接使用while循环就不容易完成,你还需要增加一个变量来看看是不是有记录

所以这种方式不是经常用到,但是在某些时候还是有用的
wcmj 2005-04-22
  • 打赏
  • 举报
回复
你是画蛇添足呀,用一个while就可以了
芒果 2005-04-21
  • 打赏
  • 举报
回复
public void run() {
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
ResultSet rs = conn.exeQuery(sql);
try {
if(rs.next()) {
do{
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
isNull = false;
}while(rs.next())
}
} catch (SQLException e) {
isNull = true;
e.printStackTrace();
}
}
hainang1234 2005-04-21
  • 打赏
  • 举报
回复
像楼上那样就行了,这是ResultSet比较典型的读取方式。
pigo 2005-04-21
  • 打赏
  • 举报
回复
public void run() {
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
ResultSet rs = conn.exeQuery(sql);
try {
while (rs.next()) {
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
isNull = false;
}
} catch (SQLException e) {
isNull = true;
e.printStackTrace();
}
}


把那个if去掉,如果rs是空的,循环自然是不会进行的了。


charlie0895 2005-04-21
  • 打赏
  • 举报
回复
if(rs.next()) {
do {
}while(rs.next());
} else {
Empty ResultSet
}这样是不行的!这样取不到第一条记录
加载更多回复(2)

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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