Ошибка Java Prepared-Statement getGeneratedKeys ()

1

Я использовал подготовленный java-оператор в инструкции try-with-resources для доступа к таблице в базе данных Java DB с NetBeans 8.0 IDE. После запуска метода executeUpdate я запустил сгенерированный метод ключей для извлечения всех автоматически сгенерированных значений. Однако сгенерированные ключи resultset дают ошибку с нулевой точкой. В таблице есть автоматически сгенерированный первичный ключ.

фрагмент кода представлен ниже.

         try (Connection  con = DriverManager.getConnection(host, uName, uPass)) {
                con.setAutoCommit(false);  //disable auto commit                                        

              try( PreparedStatement stmAlumnus = con.prepareStatement(insertSQL))  {

        stmAlumnus.setInt(1, Integer.parseInt(id_TextField.getText().trim()));
        stmAlumnus.setString(2, fName_TextField.getText().toUpperCase().trim());
        stmAlumnus.setString(3, lName_TextField.getText().toUpperCase().trim());
        stmAlumnus.setString(4, oName_TextField.getText().toUpperCase().trim());
        stmAlumnus.setInt(5, year_ComboBox.getSelectedIndex());
        stmAlumnus.setBoolean(6,employeedRadioButton.isSelected());
        stmAlumnus.setString(7, jTitle_TextField.getText().toUpperCase().trim());
        stmAlumnus.setString(8, email_TextField.getText().toUpperCase().trim()); 
        stmAlumnus.setString(9, tel_TextField.getText().toUpperCase().trim()); 

        stmAlumnus.executeUpdate(); 

        ResultSet rst = stmAlumnus.getGeneratedKeys();       
   863     
   864       while(rst.next())
   865     {System.out.println("this is the ID" + rst.getNString(1));}
   866      }  //close prepared statement 


                 con.commit(); 
         }   //close connection 
         catch (SQLException ex) 
         {


             if (con != null) {
        try {
            System.err.print("Transaction is being rolled back");
            con.rollback();
        } catch(SQLException excep) {
            excep.printStackTrace();
        }

             Logger.getLogger(MyJFrame.class.getName()).log(Level.SEVERE, null, ex);
         ex.getSuppressed();
            }
     }                       
  }

ниже приведено сообщение об ошибке из среды IDE NetBeans

 run:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at wa_poly.MyJFrame.insertIntoTables(MyJFrame.java:864)
at wa_poly.MyJFrame.saveButtonActionPerformed(MyJFrame.java:653)
at wa_poly.MyJFrame.access$700(MyJFrame.java:41)
at wa_poly.MyJFrame$8.actionPerformed(MyJFrame.java:524)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6527)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6292)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4883)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4705)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2739)
at java.awt.Component.dispatchEvent(Component.java:4705)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Suppressed: java.sql.SQLException: Cannot close a connection while a transaction is still active.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.checkForTransactionInProgress(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.close(Unknown Source)
    at wa_poly.MyJFrame.insertIntoTables(MyJFrame.java:886)
    ... 39 more
Caused by: java.sql.SQLException: Cannot close a connection while a transaction is still active.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown  
  Source)
    ... 47 more

Есть ли объяснение возникшей ошибки.

  • 0
    Какая строка кода является строкой 864 из MyJFrame.java?
  • 0
    Строка 864 - это оператор while ()
Показать ещё 1 комментарий
Теги:
prepared-statement
derby

1 ответ

4
Лучший ответ

Когда вы готовите выражение, вы должны использовать флаг.

например

ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
  • 0
    почему вы должны использовать флаг
  • 0
    Я помню, как проходил через Дерби, IIRC, тебе это нужно в Дерби, а другим нет? Это было какое-то время.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню