private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
ConnectionDTB cdtb = new ConnectionDTB();
ResultSet rs = cdtb.retrieveData("select svcode from listSV");
if(!rs.isBeforeFirst()){
System.out.println("System is null");
//add
cdtb.close();
}
else{
while(rs.next()){
if(Integer.parseInt(jTextField1.getText()) == rs.getInt("svcode")){
System.out.println("ERROR");
cdtb.close();
break;
}
else{
if(rs.isLast()){
//add
cdtb.close();
}else{
cdtb.close();
}
}
我的错误是
2015年4月25日上午2:21:29 GUI.m1 jButton1ActionPerformed 严重:空 java.sql.SQLException:ResultSet关闭后不允许操作
我做错了什么?
答案 0 :(得分:1)
在完成结果集之前,您似乎正在关闭循环内的数据库连接。
如果仍在使用与数据库连接关联的语句或结果集,则无法关闭数据库连接。 (嗯,你可以这样做,但关闭连接也会关闭结果集,你会得到你观察到的那种行为。)
规范模式是使用 try / catch / finally 块,并关闭finally块中的结果集,语句和连接。
例如:
ConnectionDTB cdtb = null;
ResultSet rs = null;
try {
cdtb = new ConnectionDTB();
rs = cdtb.retrieveData("select svcode from listSV");
while(rs.next()){
// whatever processing you need to do on each row, but
// do NOT close the result set here
// do NOT close the database connection here!
}
} catch (SQLException ex) {
// anything you want to do if an exception is thrown
} finally {
if (rs != null) {
try { rs.close(); } catch (SQLException e) { /*ignore*/ }
}
if (cdtb != null) {
try { cdtb.close(); } catch (SQLException e) { /*ignore*/ }
}
}
可以简化finally
块,删除不必要的try / catch。这也没关系:
} finally {
if (rs != null) {
rs.close();
}
if (cdtb != null) {
cdtb.close();
}
}
这里重要的是在“finally”块中进行关闭,这样即使发生异常也会运行。使用这种模式,数据库连接有一个“关闭”,而不是通过代码分散的多个调用。
其他一些说明:
如果您的代码尚不存在,那么您的代码似乎意味着“添加”一行。这是一个很大的开销,从数据库中撤回每个值并检查它。
询问数据库是否存在这样的行会更有效。要询问数据库是否存在这样的行,请使用如下语句:
SELECT svcode FROM listSV WHERE svcode = ?
准备语句,将值绑定到占位符(您要查找的值),然后执行该语句,并检查是否返回了一行。
如果您正在执行此检查以查看是否需要将行添加到listSV表,您实际上可以使用单个INSERT ... SELECT
语句来有条件地插入行。
答案 1 :(得分:0)
虽然我不认为它实际上是根据提供的信息显示的,但我认为您正在关闭结果集(在这种情况下' rs')然后再次尝试运行操作。
如果我不得不猜测,我会说取出rs.close,因为它过早地关闭了结果集。如果你想继续阅读同一套,也许可以用继续替换?
答案 2 :(得分:0)
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
ConnectionDTB cdtb = new ConnectionDTB();
ResultSet rs = cdtb.retrieveData("select svcode from listSV");
if(!rs.isBeforeFirst()){
System.out.println("System is null");
//add
cdtb.close();
rs.close();
}
else{
while(rs.next()){
if(Integer.parseInt(jTextField1.getText()) == rs.getInt("svcode")){
System.out.println("ERROR");
cdtb.close();
rs.close();
break;
}
else{
if(rs.isLast()){
//add
cdtb.close();
rs.close();
}
}
这是对的吗? 顺便告诉我AfterLast的意思吗?