Ошибка вставки данных в 2 таблицы в mySQL с помощью resultSet.update()

Я получаю эту ошибку при вставке данных в поля одной таблицы, затем изменении оператора SQL resultSet на другую таблицу и вставке в поля таблицы 2:

СЕРЬЕЗНЫЙ: null com.mysql.jdbc.NotUpdatable: набор результатов не подлежит обновлению. Этот набор результатов должен исходить из оператора, созданного с типом набора результатов ResultSet.CONCUR_UPDATABLE, запрос должен выбирать только одну таблицу, не может использовать функции и должен выбрать все первичные ключи из этой таблицы. Дополнительные сведения см. в Спецификации API JDBC 2.1, раздел 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, присутствующее в обеих таблицах. Исключение возникает, когда я пытаюсь изменить набор результатов на таблицу 2, как указано выше.

Заранее спасибо...


person dancingbush    schedule 28.11.2013    source источник
comment
Выстрел в темноте, возможно: вы пытались закрыть первый набор результатов, прежде чем открывать второй?   -  person Luke Woodward    schedule 28.11.2013
comment
да, закрыл и создал новый набор результатов таблицы 2(commissionEmployee): resultSet.close(); оператор = (оператор)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. Драйвер может быть понижен (раздел 15.1.2 спецификации JDBC 4.1):

Если драйвер не может вернуть объект ResultSet с запрошенным типом и параллелизмом, он определяет соответствующий тип перед определением параллелизма.

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