stmt.executeUpdate(sql);执行完毕是否会自动关闭

本文探讨了在Java中使用PreparedStatement执行SQL操作时遇到的问题,特别是当尝试在while循环中同时使用executeQuery和executeUpdate方法时,ResultSet会被意外关闭的情况。文章提供了一个有效的解决方案,即使用两个不同的Statement对象来分别处理查询和更新操作。
stmt.executeUpdate(sql);执行完毕是否会自动关闭
悬赏分:20 | 解决时间:2008-8-16 23:38 | 提问者:小栗子312 while (rst.next()) {
String tempname = rst.getString(2);
System.out.println(tempname);
stmt.executeUpdate("insert into message(name) values('"+ tempname + "')");// 将已注册的用户名从user表更新到message表中
}
我想通过while循环将name字段复制到另一个表,但运行时总会报错java.sql.SQLException: Operation not allowed after ResultSet closed
谁知道是为什么???
最佳答案 你之前一定是用过
rst=stmt.executeQuery(...)

rst就是stmt的结果集

但是你用到
stmt.executeUpdate("insert into message(name) values('"+ tempname + "')");


就是使stmt之前的结果集关闭了

你必须使用两个Statement

可以将代码改成这样

Statement stmt2=conn.createStatement();
while (rst.next()) {
String tempname = rst.getString(2);
System.out.println(tempname);
stmt2.executeUpdate("insert into message(name) values('"+ tempname + "')");// 将已注册的用户名从user表更新到message表中
}


要是回答的内容有问题,或认为不妥,请发送百度消息给我,消息内容加上本页网址哦。。
本关任务:使用jdbc连接数据库并完成创建数据库和创建表的操作。 相关知识 JDBC API提供以下接口和类: DriverManager:此类管理数据库驱动程序列表。可在JDBC下识别某个子协议的第一个驱动程序,用于建立数据库连接。 Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。 Connection:此接口具有用于联系数据库的所有方法。 Connection对象表示通信上下文,即与数据库的所有通信仅通过连接对象。 Statement:用于执行静态SQL语句并返回它所生成结果的对象。一些派生接口还可接受参数,如PrepareStatement。 ResultSet:提供检索不同类型字段的方法。(操作对象为Statement执行SQL查询后的结果) SQLException:此类处理数据库应用程序中发生的任何错误。 使用JDBC的步骤如下: 加载数据库驱动 → 建立数据库连接(Connection) → 创建执行SQL语句的Statement对象 → 处理执行结果(ResultSet) → 释放资源 为了完成本关任务,你需要掌握:1.如何加载数据库驱动;2.如何建立数据库连接;3.如何执行编写的SQL语句;4.释放资源。 加载数据库驱动 驱动加载是为了打开与数据库的通信通道。 在注册驱动前我们需要装载特定厂商的数据库驱动程序,导入mysq-connector-java的jar包,方法是在项目中建立lib目录,在其下放入jar包。 然后右键jar包 Build Path→Add to Build Path完成jar包导入。将jar包导入项目之后我们就开始注册驱动: Java加载数据库驱动通常是使用Class类的静态方法forName(),语法格式如下: Class.forName(String driverManager) 示例: try { Class.forName("com.mysql.jdbc.Driver" ); } catch (ClassNotFoundException e) { e.printStackT\frace(); } 如果加载成功,会将加载的驱动类注册给DriverManager;加载失败,会抛出ClassNotFoundException异常。 建立连接 成功加载完数据库驱动后,就可以建立数据库的连接了,使用DriverManager的静态方法getConnection()来实现。如下: Connection conn = DriverManager.getConnection(url, user, password); URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接信息。 若不存在数据库,只建立连接,URL的写法为: 若存在数据库test,URL的写法为: 其中localhost可以换成IP地址127.0.0.1,3306为MySQL数据库的默认端口号,user和password对应数据库的用户名和密码。 执行编写的SQL语句 连接建立完毕后,就可以使用Connection接口的createStatement()方法来获取Statement对象;并通过executeUpdate()方法来执行SQL语句。 创建statement对象 try { Statement statement = conn.createStatement(); } catch (SQLException e) { e.printStackT\frace(); } 创建数据库 try { String sql1="drop database if exists test"; String sql2="create database test"; statement.executeUpdate(sql1);//执行sql语句 statement.executeUpdate(sql2); } catch (SQLException e) { e.printStackT\frace(); } 创建表 try { statement.executeUpdate("use test");//选择在哪个数据库中操作 String sql = "create table table1(" + "column1 int not null, " + "column2 varchar(255)" + ")"; statement.executeUpdate(sql); } catch (SQLException e) { e.printStackT\frace(); } 释放资源 Jdbc程序运行完后,切记要释放程序在运行过程中创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。 特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。 Connection的使用原则是尽量晚创建,尽量早的释放。 为确保资源释放代码能运行,资源释放代码一定要放在finally语句中。 finally { try { if(statement!=null) statement.close(); if(conn!=null) conn.close(); } catch (SQLException e) { e.printStackT\frace(); } } 编程要求 在右侧编辑器补充代码,完成下列相应任务: 加载数据库驱动;【平台数据库连接的用户(user)为root,密码(password)为123123】 创建数据库mysql_db; 创建表student。 student表结构为: 字段名 类型 备注 约束 id int 学生id 非空 name varchar(20) 学生姓名 无 sex varchar(4) 学生性别 无 age int 学生年龄 无 测试说明 平台会对你编写的代码进行测试: 测试输入:无 预期输出: id INT(11) name VARCHAR(20) sex VARCHAR(4) age INT(11)
06-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值