2015-01-13 5 views
1

Я создал программу для вставки данных в базу данных MSAccess. Когда я выполняю инструкции, я получаю java.sql.SQLException: [Microsoft] [диспетчер драйверов ODBC] Неверное состояние курсора. База данных пуста. Я попытался переместить курсор в первую строку, выполнив resultSet.next(); но это не сработает. Может ли кто-нибудь сказать мне, в чем проблема? Это мой код до сих пор:Неверное состояние курсора java.sql.SQLException

Код для создания соединения:

public LogInInterface() { 
    initComponents(); 

     //Database Connection Setup. 
     try{ 
      String Driver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
      Class.forName(Driver); 
      //ErrorLabel.setText("DRIVER LOADED"); 
      //ErrorLabel.setForeground(new Color(0, 204, 0)); 
      String Login = "jdbc:odbc:JavaDB"; 
      connection = DriverManager.getConnection(Login); 
      statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 
      resultSet = statement.executeQuery(SQL); 
      //ErrorLabel.setText("DATABASE CONNECTION IS READY"); 
      //ErrorLabel.setForeground(new Color(0, 204, 0)); 
      //ErrorLabel.setText(null); 


     }catch(Exception e){ 
      ErrorLabel.setText("DATABASE CONNECTION ERROR (Code 1)"); 
      e.printStackTrace(); 
     } 

} 

Код для вставки в базу данных:

private void RegisterButtonActionPerformed(ActionEvent e) { 
    // TODO add your code here 
    try{ 
     String FName = FirstNameTextField.getText(); 
     String LName = LastNameTextField.getText(); 
     resultSet.moveToInsertRow(); 
     resultSet.updateString(2,FName); 
     resultSet.updateString(3,LName); 
     resultSet.updateRow(); 
     statement.close(); 
     resultSet.close(); 
     statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     resultSet = statement.executeQuery(SQL); 

    }catch(Exception e1){ 
     ErrorLabel.setText("ACCOUNT COULD NOT BE CREATED AT THIS TIME (Code 2)"); 
     e1.printStackTrace(); 
    } 
} 

Полная StackTrace:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state 
at sun.jdbc.odbc.JdbcOdbcResultSet.setPos(JdbcOdbcResultSet.java:5271) 
at sun.jdbc.odbc.JdbcOdbcResultSet.updateRow(JdbcOdbcResultSet.java:4171) 
at com.company.LogInInterface.RegisterButtonActionPerformed(LogInInterface.java:251) 
at com.company.LogInInterface.access$1400(LogInInterface.java:12) 
at com.company.LogInInterface$9.actionPerformed(LogInInterface.java:545) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
at java.awt.Component.processMouseEvent(Component.java:6297) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3275) 
at java.awt.Component.processEvent(Component.java:6062) 
at java.awt.Container.processEvent(Container.java:2039) 
at java.awt.Component.dispatchEventImpl(Component.java:4660) 
at java.awt.Container.dispatchEventImpl(Container.java:2097) 
at java.awt.Component.dispatchEvent(Component.java:4488) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4575) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4236) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4166) 
at java.awt.Container.dispatchEventImpl(Container.java:2083) 
at java.awt.Window.dispatchEventImpl(Window.java:2489) 
at java.awt.Component.dispatchEvent(Component.java:4488) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:674) 
at java.awt.EventQueue.access$400(EventQueue.java:81) 
at java.awt.EventQueue$2.run(EventQueue.java:633) 
at java.awt.EventQueue$2.run(EventQueue.java:631) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
at java.awt.EventQueue$3.run(EventQueue.java:647) 
at java.awt.EventQueue$3.run(EventQueue.java:645) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:644) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+0

Попробуйте это, замените инструкцию create = connection.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); with statement = connection.createStatement(); – Wils

+0

Когда я заключу свой оператор результата в if (resultSet.next()) {...} Я получаю это исключение: java.sql.SQLException: ResultSet закрыт –

+0

оставьте connection.createStatement пустым или измените флаг как manouti упомянуть. – Wils

ответ

3

Заменить ResultSet.updateRow с ResultSet.insertRow. От Javadoc of ResultSet.updateRow:

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

Также обратите внимание на Javadoc из ResultSet.moveToInsertRow который вы звоните в методе:

перемещает курсор для вставки строки. Текущее положение курсора запоминается, пока курсор находится на строке вставки. Строка вставки - это специальная строка, связанная с обновляемым набором результатов. Это, по сути, буфер, в котором новая строка может быть построена путем вызова методов обновления до вставки строки в результирующий набор. Могут быть вызваны только методы обновления, getter и insertRow, когда курсор находится на строке вставки. Все столбцы в наборе результатов должны иметь значение каждый раз, когда этот метод вызывается перед вызовом insertRow. Необходимо вызвать метод обновления, прежде чем метод getter может быть вызван по значению столбца.

+0

Да, поскольку это вставка, вы должны использовать соответствующий флаг. – Wils

+0

я resultSet.insertRow(), и я получаю эту exeception java.sql.SQLException: Invalid Cursor Type: 1003 \t на sun.jdbc.odbc.JdbcOdbcResultSet.moveToInsertRow –

+0

Эй я сумел вставить в базу данных, но в любом случае exeception является брошено: java.sql.SQLException: ResultSet закрыт \t на sun.jdbc.odbc.JdbcOdbcResultSet.checkOpen (JdbcOdbcResultSet.java:6646) \t в sun.jdbc.odbc.JdbcOdbcResultSet.clearWarnings (JdbcOdbcResultSet.java:1765) \t at sun.jdbc.odbc.JdbcOdbcResultSet.close (JdbcOdbcResultSet.java:1468) Как я могу избавиться от этого ????????? –

Смежные вопросы