我正在编写一个代码来从表中检索两列并将其存储在另一个表中。我使用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)
请帮我解决这个问题.....
答案 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
个实例,一个用于读取,另一个用于多个插入。这应该解决这个问题。