繁体   English   中英

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

[英]how to extract data from one table and insert into another table

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

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)

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

在单个查询中应该可以做到这一点:

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接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象。

基本上, ResultSet仍从该语句读取,但是您通过对同一Statement执行另一个查询来将其关闭。 如果要以这种方式执行此操作,则需要使用两个单独的语句。

 while(!rs.next())

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM