import java.util.*;
import java.sql.*;public class Test
{
public static void main(String[] args) {
  Connection con,con1;
           java.sql.Statement stm;
  java.sql.ResultSet rs;
  String fullText,sql;
  int ID;
  try{
               Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
               con = DriverManager.getConnection "JDBC:microsoft:SQLServer://127.0.0.1:1433;DatabaseName=Data","sa","******");
               stm=con.createStatement();
      rs=stm.executeQuery("select ID,Col001 from NASA1994");
      while (rs.next()) {

                    fullText=rs.getString("Col001");
  ID=rs.getInt("ID");
  sql="update NASA1994 set Col001='"+fullText.subString(1,3);
  sql=sql+"' where ID="+ID;
  stm.executeUpdate(sql);
  }
rs.close();
stm.close();
 con.close();
  }
  catch(Exception err){
  err.printStackTrace(System.out);
  }
}
}
第一次进入循环,执行了stm.executeUpdate(sql)后,rs被关闭了,回到循环体头while (rs.next()) ,产生Object has been closed.异常。
我以前是delphi程序员,这段代码是比较常用的,不知道在JAVA里怎么写。

解决方案 »

  1.   

    我查到资料,Microsoft SQL Server 拥有的JDBC驱动程序每次只允许运行一个活动语句。
    不知道这是什么意思?
    import java.util.*;
    import java.sql.*;public class Test
    {
    public static void main(String[] args) {
      Connection con,con1;
               java.sql.Statement stm,stm1;
      java.sql.ResultSet rs;
      String fullText,sql;
      int ID;
      try{
                   Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
                   con = DriverManager.getConnection "JDBC:microsoft:SQLServer://127.0.0.1:1433;DatabaseName=Data","sa","******");
                   stm=con.createStatement();
          rs=stm.executeQuery("select ID,Col001 from NASA1994");
          while (rs.next()) {

                        fullText=rs.getString("Col001");
      ID=rs.getInt("ID");
      sql="update NASA1994 set Col001='"+fullText.subString(1,3);
      sql=sql+"' where ID="+ID;
                        stm1=con.createStatement();
      stm1.executeUpdate(sql);
      }
    rs.close();
    stm.close();
     con.close();
      }
      catch(Exception err){
      err.printStackTrace(System.out);
      }
    }
    }
    在循环体内重新生成一个Statement stm1,执行stm1.executeUpdate(sql)时程序不返回
      

  2.   

    楼主你搞错了把,你的stm是前面的rs的,你做update要新建一个statement,不能混的用的
      

  3.   

    用两个连接,或者象第二次的做法使用两个statement,结果都是在执行stm1.executeupdate(sql)时程序不返回,同时我用SQLSERVER企业管理器打开这个表打不开,好像已经被锁住了,在命令行输入Ctrl+C强制结束程序后,才能用SQLSERVER企业管理器打开这个表。
      

  4.   

    你的Statement做的不对,要重新建立一个新的Statement。另外,你的这个程序写的也很不规范,要绝对尽量避免嵌套执行sql语句。另外,你说的那个实际上就是Microsoft公司的Java SQL Server驱动程序(就是那三个jar包)不支持二次查询的功能,你可以用sourceforge上的一个开源项目jtds来做,绝对比这三个包要好用的多。
      

  5.   

    mxlmwl(飞星)
    在第二种做法中我是新生成了一个Statemant,就是这两句stm1=con.createStatement(); stm1.executeUpdate(sql);,但是在执行stm1.executeUpdate(sql)时,不返回,同时我用SQLSERVER企业管理器打开这个表打不开,好像已经被锁住了,在命令行输入Ctrl+C强制结束程序后,才能用SQLSERVER企业管理器打开这个表。
    至于你说的程序写的不规范,要尽量避免嵌套执行sql语句,其实我的需要很简单,就是将数据表的锁语记录搜索一遍,对Col001字段进行一些修改,我想不出别的方式了,你有什么好主意吗?
      

  6.   

    找到问题解决方式了,确如各位所说,必须用两个Statement,但是第二种做法之所以在执行stm1.executeUpdate(sql)时不返回是因为在执行rs=stm.executeQuery("select ID,Col001 from NASA1994");时,JDBC已经将数据表锁住,所以在循环体内执行stm1.executeUpdate(sql)时,不返回了,同时也解释了为什么这个时候用MSSQLSERVER企业管理器也打不开数据表。在ADO中好像也遇到过类似问题。
    解决方法:
    stm=con.createStatement();有问题,替换成stm=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
    stm1=con.createStatement(); 替换成stm=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    具体createStatement方法的参数都是什么含意,JDK的帮助文档里讲的大简单了,有没有这方面的资料介绍一下。
      

  7.   

    具体createStatement方法的参数都是什么含意,JDK的帮助文档里讲的大简单了,各位有没有这方面的资料分享一下。