如何从一个表中提取数据并插入另一个表

时间:2011-04-19 08:36:57

标签: java jdbc

我正在编写一个代码来从表中检索两列并将其存储在另一个表中。我使用MS Accesses作为数据库。 代码如下

public void connectDb(){
   try{

  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  Connection con=DriverManager.getConnection("jdbc:odbc:harish","scott","tiger");
  Statement st= con.createStatement();
  ResultSet rs=st.executeQuery("select sev,al from pgw_alarm where sev='000'");
  while(!rs.next())
  {
   String sev= rs.getString("sev");
   String al= rs.getString("al");
   st.executeUpdate("insert into info_alarm values('"+sev+"','"+al+"')");
  }
}catch(Exception e){e.printStackTrace();
    System.out.println("some error");}
}

以下堆栈跟踪

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)

    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3907)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5698)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:354)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:411)

请帮我解决这个问题.....

3 个答案:

答案 0 :(得分:3)

这应该可以在一个查询中进行:

INSERT INTO info_alarm (sev, al)
  SELECT sev, al FROM pgw_alarm where sev='000';

它会更清洁,更快。

!中的while (!rs.next())可能只是一个错字,对吗?

修改:要回答您的问题,请查看JavaDoc

  

默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果读取一个ResultSet对象与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的Statement对象生成。 Statement接口中的所有执行方法都隐式关闭一个statment的当前ResultSet对象(如果存在一个open对象)。

基本上ResultSet仍在从语句中读取,但是您通过在同一Statement上执行另一个查询来关闭它。如果你想这样做,你需要使用两个单独的语句。

答案 1 :(得分:0)

 while(!rs.next())

您为什么要查看!rs.next()?如果光标指向有效行,则ResultSet.next()返回true,如果不存在更多行,则返回false。如果您的查询没有返回任何结果,rs.next()将返回false。 !rs.next() - > not false - > true - >您的while块将在空结果集上执行。

这几乎肯定是你的问题所在。将其更改为while(rs.next())

答案 2 :(得分:0)

非常确定问题是由重用Statement实例引起的。它在JavaDoc中说:

  

如果存在一个开放的对象,则Statement接口中的所有执行方法都会隐式关闭一个语句的当前ResultSet对象。

因此,当您执行insert语句时,实际结果集将被关闭,这可能会引发异常。 (“无效的游标状态”是另一个提示)

创建到不同的Statement个实例,一个用于读取,另一个用于多个插入。这应该解决这个问题。