对next方法的第一次调用会将底层的游标位置放置到返回的 ResultSet结果集中的第一个数据行前,当你再执行查询,游标返回到rs1时,rs已沦落为空指针。

解决方案 »

  1.   

    事实上原因在于,这里的rs和rs1都是从同一个sm中生成的,ResultSet对象和与之相关联的Statement对象密切相关,一旦某个ResultSet对象相对应的Statement对象被修改,该ResultSet对象的句柄将沦为null,而该Statemnet对象将与新的ResultSet对象关联。
      

  2.   


    import java.sql.*;public class test
    {
    private Connection conn;
    private Statement sm;
    private ResultSet rs;
    private String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=CARD";
    private String driverName="com.microsoft.jdbc.sqlserver.SQLServerDriver";
    private String user="sa";
    private String password="kgb911";
        
    public test()
    {
      try 
      {
        Class.forName(driverName);
        conn = DriverManager.getConnection(url,user,password);
        sm = conn.createStatemen(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
       }
       catch (ClassNotFoundException ex) 
       {
          System.err.println(ex);
       }
       catch (SQLException ex) 
       {
          System.err.println(ex);
       }
     try
    {
    rs = sm.executeQuery("SELECT BEGINTIME,ENDTIME,SERVERNO FROM NETCONSUME WHERE ID=05750493");
    while(rs.next())
    {
    String ss = rs.getString("SERVERNO");
    System.out.println(ss);
    Statement sm1=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet rs1 = sm1.executeQuery("SELECT NAME FROM DEPARTMENT WHERE DKEY="+"'"+ss+"'");
    while(rs1.next())
    {
    System.out.println(rs1.getString("NAME"));
    }
    rs1.close();
    sm1.close();
    }
    rs.close();
    sm.close();
    conn.close();
    }
    catch(Exception e2)

       System.out.println(e2.toString());
    }
    }
        
    public static void main(String args[])
    {
    test db = new test();
    }
    }
      

  3.   

    定义两个Statement对象就可以了!!一个记录集使用一个STATEMENT对象!!
    当Statement的语句改变的时候,记录集的内容也会清空,他们两个是密切关联的!!