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里怎么写。
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里怎么写。
不知道这是什么意思?
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)时程序不返回
在第二种做法中我是新生成了一个Statemant,就是这两句stm1=con.createStatement(); stm1.executeUpdate(sql);,但是在执行stm1.executeUpdate(sql)时,不返回,同时我用SQLSERVER企业管理器打开这个表打不开,好像已经被锁住了,在命令行输入Ctrl+C强制结束程序后,才能用SQLSERVER企业管理器打开这个表。
至于你说的程序写的不规范,要尽量避免嵌套执行sql语句,其实我的需要很简单,就是将数据表的锁语记录搜索一遍,对Col001字段进行一些修改,我想不出别的方式了,你有什么好主意吗?
解决方法:
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的帮助文档里讲的大简单了,有没有这方面的资料介绍一下。