同一个Statement 怎么不能执行两条sql语句???

时间:2020-12-01 11:56:01
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
stmt = conn.createStatement();
String sql = "select * from ps_dp_fax_out";
rs = stmt.executeQuery(sql);
         while (rs.next()) {
          ...................
          ...................//向另一个数据库插入记录
          ...................
         }
        //然后update本数据库的数据
        String changeSql ="insert ps_dp_fax_change values ('"
+ rs.getString("id") + "','" + ExID + "','"+currDate+"')";
        int n = stmt.executeUpdate(changeSql);  //为什么stmt 重复利用的时候,  下一个循环 rs.next() 会出错 [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.


         

10 个解决方案

#1


你看看是不是调用了stmt.close()方法

#2


while (rs.next()) {
...................
...................//向另一个数据库插入记录
...................
}

以上代码跑过以后,rs.next()为false;调用rs.getString("id")会报错

#3


rs = stmt.executeQuery(sql);
是查询的啊

插入是stmt.executeUpdata(sql);

而且这种Statement 在插入数据时候不推荐使用
你可以用 PreparedStatement 
这个会很方便的
尤其在多条时候优势更明显

#4


这个确实是这样的,建议可以使用多个statement

#5


问题所在应该是 cyfnjtu(迎风) 所讲的

#6


while (rs.next()) {
          ...................
          ...................//向另一个数据库插入记录
          ...................
                //然后update本数据库的数据
        String changeSql ="insert ps_dp_fax_change values ('"
+ rs.getString("id") + "','" + ExID + "','"+currDate+"')";
        int n = stmt.executeUpdate(changeSql);  //为什么stmt 重复利用的时候,  下一个循环 rs.next() 会出错 [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.


 }
代码贴错了

#7


ResultSet是和Statement关联的,你重新执行了executeUpdate后之前的数据集就已经因为Statement内容的改变而关闭了。建议你用另一个Statement来执行更新。

#8


换个JDBC驱动试试 比如换成JTDS 因为MSSQL驱动不是很可靠.

#9


ResultSet是和Statement关联的,你重新执行了executeUpdate后之前的数据集就已经因为Statement内容的改变而关闭了。建议你用另一个Statement来执行更新。
正解

#10


stmt = conn.createStatement(); 
改成:stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

第一个参数可以取值为 
ResultSet.RTYPE_FORWORD_ONLY,只可向前滚动; 
ResultSet.TYPE_SCROLL_INSENSITIVE,双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。 
ResultSet.TYPE_SCROLL_SENSITIVE,双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。 


第二个参数可以取值为 
ResultSet.CONCUR_READ_ONLY:这是缺省值,指定不可以更新 ResultSet 
ResultSet.CONCUR_UPDATABLE:指定可以更新 ResultSet

#1


你看看是不是调用了stmt.close()方法

#2


while (rs.next()) {
...................
...................//向另一个数据库插入记录
...................
}

以上代码跑过以后,rs.next()为false;调用rs.getString("id")会报错

#3


rs = stmt.executeQuery(sql);
是查询的啊

插入是stmt.executeUpdata(sql);

而且这种Statement 在插入数据时候不推荐使用
你可以用 PreparedStatement 
这个会很方便的
尤其在多条时候优势更明显

#4


这个确实是这样的,建议可以使用多个statement

#5


问题所在应该是 cyfnjtu(迎风) 所讲的

#6


while (rs.next()) {
          ...................
          ...................//向另一个数据库插入记录
          ...................
                //然后update本数据库的数据
        String changeSql ="insert ps_dp_fax_change values ('"
+ rs.getString("id") + "','" + ExID + "','"+currDate+"')";
        int n = stmt.executeUpdate(changeSql);  //为什么stmt 重复利用的时候,  下一个循环 rs.next() 会出错 [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.


 }
代码贴错了

#7


ResultSet是和Statement关联的,你重新执行了executeUpdate后之前的数据集就已经因为Statement内容的改变而关闭了。建议你用另一个Statement来执行更新。

#8


换个JDBC驱动试试 比如换成JTDS 因为MSSQL驱动不是很可靠.

#9


ResultSet是和Statement关联的,你重新执行了executeUpdate后之前的数据集就已经因为Statement内容的改变而关闭了。建议你用另一个Statement来执行更新。
正解

#10


stmt = conn.createStatement(); 
改成:stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

第一个参数可以取值为 
ResultSet.RTYPE_FORWORD_ONLY,只可向前滚动; 
ResultSet.TYPE_SCROLL_INSENSITIVE,双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。 
ResultSet.TYPE_SCROLL_SENSITIVE,双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。 


第二个参数可以取值为 
ResultSet.CONCUR_READ_ONLY:这是缺省值,指定不可以更新 ResultSet 
ResultSet.CONCUR_UPDATABLE:指定可以更新 ResultSet