как извлечь данные из одной таблицы и вставить в другую таблицу - PullRequest
1 голос
/ 19 апреля 2011

Я пишу код для извлечения двух столбцов из таблицы и сохранения его в другой таблице. Я использую MS Access в качестве базы данных. код выглядит следующим образом

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 ]

3 голосов
/ 19 апреля 2011

Это должно быть возможно в пределах одного запроса:

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

Это будет чище и быстрее.

! в while (!rs.next()), вероятно, просто опечатка, верно?

Редактировать: Чтобы ответить на ваш вопрос, изучите JavaDoc :

По умолчанию только один объект ResultSet на каждый объект Statement можетбыть открытым в то же время.Следовательно, если чтение одного объекта ResultSet чередуется с чтением другого, каждый из них должен быть сгенерирован различными объектами Statement.Все методы выполнения в интерфейсе Statement неявно закрывают текущий объект ResultSet статута, если существует открытый.

Обычно ResultSet все еще читает из оператора, но вы закрыли его, выполнив другой запрос для того же Statement.Если вы хотите сделать это таким образом, вам нужно использовать два отдельных утверждения.

0 голосов
/ 19 апреля 2011

Уверен, что проблема вызвана повторным использованием экземпляра Statement. В JavaDoc написано:

Все методы выполнения в интерфейсе Statement неявно закрывают текущий объект ResultSet статута, если существует открытый.

Таким образом, когда вы выполняете оператор вставки, фактический набор результатов закрывается, и это может вызвать исключение. («недопустимое состояние курсора» - еще одна подсказка)

Создать для разных Statement экземпляров, один для чтения, другой для нескольких вставок. Это должно исправить эту проблему.

0 голосов
/ 19 апреля 2011
 while(!rs.next())

Почему вы проверяете на !rs.next()? ResultSet.next() возвращает значение true, если курсор указывает на правильную строку, и значение false, если строк больше не существует. Если ваш запрос не возвращает результатов, rs.next () вернет false. !rs.next() -> not false -> true -> ваш блок while будет выполнен с пустым набором результатов.

Это почти наверняка, в чем ваша проблема. Измените его на while(rs.next())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...