Java中数据库操作的错误!

         今天在写 Java 数据库程序的时候,碰到一个问题,说出来,更大家分享下。
是这样的,请先开下面程序片断:

//程序片断1

 void func()
 {
  .......
  ResultSet rs = stmt.executeQuery (sql);
  if ( rs.next () )//表明找到记录

  {
   ......
   try
      {
          bs.setId (rs.getInt ("id"));
      } catch (SQLException ex)
      {
          ex.printStackTrace();
      }
      try
      {
          bs.setStrAddress (rs.getString ("address"));
      } catch (SQLException ex1)
      {
          ex1.printStackTrace();
      }
      .....
  }
  ..........
 }

 
因为 “//程序片断1”中的if语句太长,我将其抽取为一个独立的函数,如下:

//程序片断2

 void func()
 {
  .......
  ResultSet rs = stmt.executeQuery (sql);
  setBohaoStudentField(bs,rs);
  ..........
 }
 //程序片断3

 private void setBohaoStudentField (final BohaoStudentMenber bs, final ResultSet rs) throws SQLException
    {
     if ( rs.next () )//表明找到记录

     {
            ......
   try
      {
          bs.setId (rs.getInt ("id"));
      } catch (SQLException ex)
      {
          ex.printStackTrace();
      }
      try
      {
          bs.setStrAddress (rs.getString ("address"));
      } catch (SQLException ex1)
      {
          ex1.printStackTrace();
      }
      .....
      }
 }

这样本没有错误,而且使得程序逻辑更清晰了。
好的下面我们继续向后看。
在后面的某个时候,我需要对rs.next()为空的情况进行处理,好的我自然想到按如下方式进行:

//程序片断4

 void func()
 {
  .......
  ResultSet rs = stmt.executeQuery (sql);
  if ( rs.next () )//表明找到记录

  {
   setBohaoStudentField(bs,rs);
  }else
  {
   ....
  }
  ..........
 }
 //程序片断5

 private void setBohaoStudentField (final BohaoStudentMenber bs, final ResultSet rs) throws SQLException
    {
     if ( rs.next () )//表明找到记录

     {
            ......
   try
      {
          bs.setId (rs.getInt ("id"));
      } catch (SQLException ex)
      {
          ex.printStackTrace();
      }
      try
      {
          bs.setStrAddress (rs.getString ("address"));
      } catch (SQLException ex1)
      {
          ex1.printStackTrace();
      }
      .....
      }
 }

这样做了之后,程序出现了错误,我不知道错在哪里,
但是我知道在我这样改了之后,程序就出错了,
好的,我就在我更改的地方进行断点跟踪,
最后发现是“//程序片断4” 和“//程序片断5”的调用出现错误了,
为什么呢?我并没有更改他们的调用方式阿,为什么错误了呢?
为什么在“//程序片断4”中的if ( rs.next () ) 判断为真,
但是在“//程序片断5”中的if ( rs.next () ) 判断为假了呢?
查看帮助文档,发现 ResultSet.next() 的说明是这样的:
boolean next()
          Moves the cursor down one row from its current position.
我突然意识到我犯了一个致命的错误,在我调用
 setBohaoStudentField(bs,rs);
函数之前,我作了一次
    if ( rs.next () )
判断,之后在
 setBohaoStudentField
函数体内部我又再次做了一次
 if ( rs.next () )
判断,
到这里就明白了,这个时候的判断,
记录集 rs 的游标已经因为在调用之前的那次判断而向下移动了一个,
也就是说当前的记录改变了,
这就是所有的症结所在.
这真是让人很郁闷的事情啊,还好,我及时发现了,
要是等到后面的某个时候去调试,那还不知道要跟踪到什么时候呢!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值