![](/img/trans.png)
[英]How to insert data into a table such that one value comes from another table and other value comes from the form
[英]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.