我用java从数据库中调数据出来,连接时出错,显示得错误信息为
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid operation for the current cursor position.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.validateCursorPosition(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.getDouble(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.getDouble(Unknown Source)
我在网上查了,关于这个错误的原因说是由于没有加上rs.next()但问题是我已经加上了,而且程序里别得部分连接数据库的读取都正常,下面是我连接数据库和从中读程序得代码,请帮我看看我到底哪里出了问题。谢谢
if(keyword==null){ st=conn.createStatement();
st1=conn.createStatement(); rs=st.executeQuery(sql1);
rs1=st1.executeQuery(sql2);

System.out.println("sql1="+sql1+"");
System.out.println("sql2="+sql2+""); while(rs.next()){
foreman=new ForecastManager(); double forNum=rs.getDouble("forNum");
double forMoney=rs.getDouble("forMoney");
double saleNum=rs.getDouble("saleNum");
double saleMoney=rs.getDouble("saleMoney"); String proNum = myformat.format((forNum-saleNum)/saleNum);//销售量增长率  
String proMon = myformat.format((forMoney-saleMoney)/saleMoney);//销售额增长率   foreman.setTheyear(rs.getInt("theyear"));
foreman.setSeason(rs.getInt("season"));
foreman.setForNum(rs.getDouble("forNum"));
foreman.setForMoney(rs.getDouble("forMoney"));
foreman.setSaleNum(rs.getDouble("saleNum"));
foreman.setSaleMoney(rs.getDouble("saleMoney")); foreman.setProbilityNum(proNum);
foreman.setProbilityMoney(proMon);

System.out.println("list1统计开始");
System.out.println("年是"+foreman.getTheyear());
System.out.println("季度是"+foreman.getSeason());
System.out.println("数量增张率"+proNum);
System.out.println("销售额增张率"+proMon);

list1.add(foreman);

System.out.println("list1已经添加一个成功,结束");
}rs.close(); while(rs1.next()){ foreman=new ForecastManager(); double forNum=rs.getDouble("forNum");
double forMoney=rs.getDouble("forMoney");
double saleNum=rs.getDouble("saleNum");
double saleMoney=rs.getDouble("saleMoney"); String proNum = myformat.format((forNum-saleNum)/saleNum);//销售量增长率  
String proMon = myformat.format((forMoney-saleMoney)/saleMoney);//销售额增长率   foreman.setTheyear(rs.getInt("theyear"));
foreman.setSeason(rs.getInt("season"));
foreman.setForNum(rs.getDouble("forNum"));
foreman.setForMoney(rs.getDouble("forMoney"));
foreman.setSaleNum(rs.getDouble("saleNum"));
foreman.setSaleMoney(rs.getDouble("saleMoney")); foreman.setProbilityNum(proNum);
foreman.setProbilityMoney(proMon); foreman.setArea(rs.getString("area"));
System.out.println("list2统计开始");
System.out.println("年是"+foreman.getTheyear());
System.out.println("季度是"+foreman.getSeason());
System.out.println("区域是"+foreman.getArea());
System.out.println("数量增张率"+proNum);
System.out.println("销售额增张率"+proMon);

list2.add(foreman);

System.out.println("list2已经添加一个成功,结束"); }rs1.close();

解决方案 »

  1.   

    同一个Connection对象:conn,第一次调用没有关闭可以再调用吗
    st=conn.createStatement(); 
    st1=conn.createStatement();期待有高手来解答
      

  2.   

    没关闭肯定是可以在次调用的    你的代码没问题  
    你写一个简单的连接数据库  看可不可以连接成功  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    Connection conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433","sa","");
    System.out.println(conn);
    看看有没有问题 
    你的SQLSERVER  估计没打SP4补丁
      

  3.   

    既然其他地方能用,那楼主的数据库应该打过补丁了。楼主可以判断一下rs是否为空,为空说明没查到东西,然后把sql语句打印出来检查一下,看看是否有问题
      

  4.   

    楼主,经典的copy-past错误,
    你在第二个循环中,依然使用了rs.getXXX,
    而rs已经在第一个循环中遍历到头了。while(rs1.next()){foreman=new ForecastManager();double forNum=rs.getDouble("forNum");
    double forMoney=rs.getDouble("forMoney");
    //以下的都是
    double saleNum=rs.getDouble("saleNum");
    double saleMoney=rs.getDouble("saleMoney");String proNum = myformat.format((forNum-saleNum)/saleNum);//销售量增长率 
    String proMon = myformat.format((forMoney-saleMoney)/saleMoney);//销售额增长率 foreman.setTheyear(rs.getInt("theyear"));
    foreman.setSeason(rs.getInt("season"));
    foreman.setForNum(rs.getDouble("forNum"));
    foreman.setForMoney(rs.getDouble("forMoney"));
    foreman.setSaleNum(rs.getDouble("saleNum"));
    foreman.setSaleMoney(rs.getDouble("saleMoney"));foreman.setProbilityNum(proNum);
    foreman.setProbilityMoney(proMon);foreman.setArea(rs.getString("area"));
    System.out.println("list2统计开始");
    System.out.println("年是"+foreman.getTheyear());
    System.out.println("季度是"+foreman.getSeason());
    System.out.println("区域是"+foreman.getArea());
    System.out.println("数量增张率"+proNum);
    System.out.println("销售额增张率"+proMon);list2.add(foreman);System.out.println("list2已经添加一个成功,结束");}rs1.close(); 
      

  5.   

    还有啊,大家回答问题是不是也应该敬业点,别一见到sql server就开始说补丁的事儿。哈哈!
      

  6.   

    请7楼的 楼主 看看异常 在说  java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid operation for the current cursor position. 如果真是 你所说的 第2个循环中仍然使用了上面的 rs会 报这个错误么希望你能明白什么是竞业  不看异常 直接看代码错误