Грешка при вмъкване на данни в 2 таблици в mySQL с resultSet.update()

Получавам тази грешка, когато вмъквам данни в полетата на една таблица, след това променям SQL оператора resultSet в друга таблица и вмъквам в полетата на таблица 2:

SEVERE: null com.mysql.jdbc.NotUpdatable: Наборът от резултати не може да се актуализира. Този набор от резултати трябва да идва от израз, който е създаден с тип набор от резултати ResultSet.CONCUR_UPDATABLE, заявката трябва да избере само една таблица, не може да използва функции и трябва да избере всички първични ключове от тази таблица. Вижте спецификацията на JDBC 2.1 API, раздел 5.6 за повече подробности.

Операторът resultSet е настроен на актуализираем:

statement = (Statement) connection.createStatement(ResultSet.CONCUR_UPDATABLE, ResultSet.TYPE_SCROLL_INSENSITIVE);

Изразът resultSet за таблица 1 и таблицата:

resultSet =  (ResultSet) statement.executeQuery(SELECT * FROM employees);

+----------------------+-----------+----------+------------+----------------------------+----------------+
| socialSecurityNumber | firstName | lastName | birthday   | employeeType               | departmentName |
+----------------------+-----------+----------+------------+----------------------------+----------------+
| 111-11-1111          | John      | Smith    | 1945-01-02 | salariedEmployee           | R&D            |
| 222-22-2222          | Sue       | Jones    | 1961-02-03 | commissionEmployee         | SALES          |
| 234435               | ciaran    | mooney   | 2013-11-28 | commissionEmployee         | Sales          |
| 333-33-3333          | Bob       | Lowis    | 1958-10-05 | basePlusCommissionEmployee | SALES          |
| 444-44-4444          | Karen     | Price    | 1972-05-25 | hourlyEmployee             | HR             |
+----------------------+-----------+----------+------------+----------------------------+----------------+

Таблица 2:

+----------------------+------------+----------------+-------+
| socialSecurityNumber | grossSales | commissionRate | bonus |
+----------------------+------------+----------------+-------+
| 222-22-2222          |      10100 |           0.05 |     0 |
| 222-22-2222          |   12234445 |            0.6 |   300 |
+----------------------+------------+----------------+-------+
2 rows in set (0.00 sec)
//using a object of class employee to update Table employees via resultSet
//manipulate the data in the resultSet, then  upadteRow to save changes on DataBase
        resultSet.moveToInsertRow();//insert a into a empty row
        resultSet.updateString("socialSecurityNumber", addEmployee.getSocialSecurityNumber());
        resultSet.updateString("firstName", addEmployee.getFirstName());
        resultSet.updateString("lastName", addEmployee.getLastName());
        resultSet.updateString("departmentName", addEmployee.getDepartment());
        resultSet.updateDate("birthday", new java.sql.Date(addEmployee.getDOB().getTime()));
        resultSet.updateString("employeeType", "commissionEmployee");
        resultSet.updateString("departmentName", addEmployee.getDepartment());


        //EXCEPTION THROWN HERE
        //new resultSet for commsionRate employee
        statement = (Statement) connection.createStatement(ResultSet.CONCUR_UPDATABLE, ResultSet.TYPE_SCROLL_INSENSITIVE);
        resultSet = (ResultSet) statement.executeQuery("SELECT * FROM commissionEmployees");
        resultSet.updateString("socialSecurityNumber", addEmployee.getSocialSecurityNumber());
        resultSet.updateInt("grossSales", (int)addEmployee.getGrossSales());

        resultSet.updateDouble("commissionRate", addEmployee.getCommissionRate());
        resultSet.updateDouble("bonus", 0);

        //uopdate the database*/
        resultSet.insertRow();

        //return cursor to orginal position
        resultSet.beforeFirst();

Първичният ключ е полето SocialSecurityNumber, присъстващо и в двете таблици. Изключението се хвърля, когато се опитам да променя resultSet на таблица 2, както е подчертано по-горе.

Благодаря предварително...


person dancingbush    schedule 28.11.2013    source източник
comment
Изстрел в тъмното, може би: опитвали ли сте да затворите първия набор от резултати, преди да отворите втория?   -  person Luke Woodward    schedule 28.11.2013
comment
да, затворен и създаден нов resultSet на таблицата 2(commissionEmployee): resultSet.close(); statement = (Statement)connection.createStatement(ResultSet.CONCUR_UPDATABLE, ResultSet.TYPE_SCROLL_INSENSITIVE); resultSet = (ResultSet) statement.executeQuery(SELECT * FROM CommissionEmployees);   -  person dancingbush    schedule 29.11.2013


Отговори (1)


Вие се обаждате на createStatement(int resultSetType, int resultSetConcurrency) с грешен ред на аргументите:

Параметри:
resultSetType - тип набор от резултати; един от ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE или ResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency - тип едновременност; едно от ResultSet.CONCUR_READ_ONLY или ResultSet.CONCUR_UPDATABLE

Така че трябва да го наречете така:

createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

Някои комбинации от тип и паралелност може да не се поддържат непременно. Не знам какво се отнася за MySQL драйвера. Драйвер може да се понижи (JDBC 4.1 спецификация раздел 15.1.2):

Ако драйверът не може да върне ResultSet обект при заявения тип и едновременност, той определя подходящия тип, преди да определи едновременността

person Mark Rotteveel    schedule 29.11.2013
comment
Дяволът е в детайлите... промених реда на предложените аргументи и работех добре, благодаря на всички за приноса - person dancingbush; 30.11.2013