08-06
02

导入脚本错误总结

做了一个把原来access数据库中留言本导入现有mysql数据库的脚本程序.采用的方式是jdbc直连(好久没这么用了,纯属为了方便).遇到的错误如下:
一.[Microsoft][ODBC 驱动程序管理器] 无效的游标状态
不能确认是否得到结果集,加判断即可:while(rs.hasnext())

二.java.sql.SQLException: ResultSet is closed
以下是异常代码的举例

try {

   DBConnection db = new DBConnection();//DBConnection是自定义用于实现JDBC-ODBC数据库连接的类,类
                                       //中实现了 返回Connection 和 Statement 的方法
   ResultSet rs1,rs2 ;
   Statement stmt = db.getStatement();
   rs1 = stmt.executeQuery("select * from table1;");

   while(rs1.next()){
       rs2 = stmt.executeQuery("select * from table2;");
       while(rs2.next()){
                        /* 一段代码 */
       }
    }
    rs2.close();
    rs1.close();
    stmt.close();
}catch (SQLException ex) { System.out.println(ex); }

        代码运行后, 就会抛出 java.sql.SQLException: ResultSet is closed 的异常,这是因为程序在while与while的嵌套循环中,每循环到一次rs1的时候,就会循环到一次rs2,而rs1和rs2都是通过stmt生成的结果集,所以在生成rs2的时候,stmt就自动把rs1关掉了,再循环到rs1的时候,系统自然酒会抛出ResultSet is closed 的异常了,解决的方法就是创建两个Statement,rs1和rs2分别由不同的Statement生成,就不会抛出异常了 修改如下

try {
  DBConnection db = new DBConnection();//DBConnection是自定义的用于实现JDBC-ODBC数据库连接的类,类
                                                  //中实现了 返回Connection 和 Statement 的方法
  ResultSet rs1,rs2;
  Statement stmt1,stmt2;
  Connection conn = db.getConnection();
  stmt1 = conn.createStatement();// 创建两个Statement实例
  stmt2 = conn.createStatement();


  rs1 = stmt1.executeQuery("select * from table1;");//rs1由stmt1生成结果
  while(rs1.next()){
      rs2 = stmt2.executeQuery("select * from table2;");//rs2由stmt2生成结果
      while(rs2.next()){
           /* 一段代码 */
      }
   }
   rs2.close();
   rs1.close();
   stmt1.close();
   stmt2.close();
}catch (SQLException ex) { System.out.println(ex); }

这样运行就不会抛出异常了


文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 导入 import
相关日志:
评论: 0 | 引用: 0 | 查看次数: 545
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭