在下面程序里有两个while循环,如果改成if,处理第一条记录就没有问题。但是如果使用while进行循环就会出问题。
程序逻辑是,从sys-mentioinfo里查找记录,如果有,则产生相应的短信,插到sys-duanxin表里。
测试数据在表里都存在,麻烦给看看好吗? 是不是跟SQLException有关系public   class   RemindTask   extends   TimerTask   

    public   void   run()   
    {       
        try   

            Connection   conn   =   JdbcPool.getConnection();             
            Statement   stmt   =   conn.createStatement();   
            String   sqlstr=   "select   *   from   sys_mentioninfo   where   hasmention='no'";   
            ResultSet   rs   =   stmt.executeQuery(sqlstr);   
            while(rs.next())   
            {             
                String   mentiontime   =   rs.getString("mentiontime").substring(0,10); 
                SimpleDateFormat   formatter   =   new   java.text.SimpleDateFormat("yyyy-MM-dd");   
                Date   mentionTime   =   new   java.util.Date(); 
                mentionTime   =   formatter.parse(mentiontime);     //   字符串转换为时间类型 
                Date   currentTime   =   new   Date(); 
                String   sourcetime   =   formatter.format(currentTime);     //将日期时间格式化 
                long   diffDays   =   (mentionTime.getTime()-   currentTime.getTime())/(24*60*60*1000);   
                System.out.print(diffDays); 
                if(diffDays <=0) 
                { 
                    stmt   =   conn.createStatement(); 
            sqlstr="select   loginname   from   sys_personauth   where   sdoi='"   +   rs.getString("sdoi")   +   "'   and   serialcode='"   +   rs.getString("serialcode")   +   "'"; 
            ResultSet   rs1=   stmt.executeQuery(sqlstr); 
          if(rs1.next())   
    { 
        rs1.beforeFirst(); 
        while(rs1.next()) 
        { 
    stmt   =   conn.createStatement(); 
    sqlstr   =   "insert   into   sys_duanxin(sender,receiver,content,sendtime,ifdo)   values('SYSTEM','"   +   rs1.getString("loginname")   +   "','"   +   rs.getString("content")   +   "','"   +   sourcetime   +   "','no')"; 
    stmt.executeUpdate(sqlstr); 
        } 
                  } 
          else 
          { 
      throw   new   Exception("no   record   fit");     
          } 

                else 
      { 
      throw   new   Exception("days   not   fit");     
          } 
            } 
        } 
catch(Exception   ef) 

      ef.printStackTrace(); 

    }   } 

解决方案 »

  1.   


    这样当然会出错的,一般对处理ResultSet都这样做:while(rs.hasNext()){ 
       
       yourObject = (YourObject)rs.next();
       String name = yourObject.getString("name");
    }
      

  2.   

    我提醒一下,你不明白我就没办法了!Connection 可以理解成一个通道
    rs 可以理解成许多连续的的数据,rs.next 在通道上换到下一个数据准备处理很可惜,这一批数据还没有处理完,你又重新创建了一批新的数据
    上一批数据丢失了一个通道是不能同时交叉传输2套数据的。 -----------------------------------------------
    如果你还没明白,
    我最后告诉你,你不能在一个连接里面嵌套ResultSet
      

  3.   

    我明白二楼说的conn的概念,但是我一个用的是rs,一个用的是rs1,并且都声明了stmt。这样应该能够保证这两个结果集互不相干,并且同时存在。我以前有不少程序都是嵌套不同的结果集。如果在第二个结果集之前不声明stmt,那么就会提示 object is closed。
      

  4.   

    hasNext() 
              如果仍有元素可以迭代,则返回 true。 
    next() 
              返回迭代的下一个元素。 
    如果你写成这样String aa=null;
    while((aa=(String)rs.next())!=null && (aa=(String)rs.next()).length>0){}或者你写成while(rs.hasNext()){}
      

  5.   

    我想看一下你的错误异常,我猜是  ResultSet 已关闭。    Statement stmt = conn.createStatement();// 最前面你用的是这个
        if (diffDays <= 0) {
          stmt = conn.createStatement(); // 后面你用的还是这个
    如果你用2个不同的 Statemetn , 我认为没有问题!
      

  6.   

    谢谢各位的回答。首先我用eclipse开发,jdk是1.5. 没有看见结果集里有hasNext 方法,直接写会显示红色波浪线;另外,我没有结果集也都用了一个新的stmt,例如 stmt1 stmt2等,但是还是不对;第三,我不知道怎么查看错误信息;因为没有main程序,我不知道怎么调试。我现在运行的方法就是不停地启动tomcat,来运行类。不知道该怎么办了
      

  7.   

    1 停地启动tomcat ,你怎么启动的?是服务器形式吗? 日志在 tomcat/logs 目录下面
    2 建议你用多个Connection 运行看看,至少排出这个可能!
      

  8.   

    又学到了,
    Java 5中的ResultSet竟然不支持hasNext方法了
      

  9.   

    问题已经解决了。但是不知道原因,只是偶然碰上了。
    在合体字的while那里,原来加了
    if(rs.next())
    {
      rs.beforelast();这样的判断。但是发现只要去掉这个判断,程序就能正常执行。但是这里也有隐患,一旦表里为空,就会出错。但是我实在不知道为什么加这个判断就出问题。  public void run() 
      {    
        try 
    {
          Connection conn = JdbcPool.getConnection();      
          Statement stmt = conn.createStatement(); 
          String sqlstr= "select * from sys_mentioninfo where hasmention='no'"; 
          ResultSet rs = stmt.executeQuery(sqlstr);
          while(rs.next())      {
              String mentiontime = rs.getString("mentiontime").substring(0,10);
              SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd"); 
              Date mentionTime = new java.util.Date();
              mentionTime = formatter.parse(mentiontime);  // 字符串转换为时间类型
              Date currentTime = new Date();
              String sourcetime = formatter.format(currentTime);  //将日期时间格式化
              long diffDays = (mentionTime.getTime()- currentTime.getTime())/(24*60*60*1000);          
              if(diffDays<=0)
              {            
             stmt = conn.createStatement();  
             sqlstr="select loginname from sys_personauth where sdoi='" + rs.getString("sdoi") + "' and serialcode='" + rs.getString("serialcode") + "'";
             ResultSet rs1 = stmt.executeQuery(sqlstr);
        while(rs1.next()) 
    {
    stmt = conn.createStatement();
    sqlstr = "insert into sys_duanxin(sender,receiver,content,sendtime,ifdo) values('SYSTEM','" + rs1.getString("loginname") + "','" + rs.getString("content") + "','2008-01-01','no')";
        stmt.executeUpdate(sqlstr);
    }
              }
            }
    }
    catch(Exception ef)
    {
       ef.printStackTrace();
    }
      }