JAVA + Mysql PreparedStatement.setString () ArrayStoreException - PullRequest
2 голосов
/ 12 марта 2012

Я получаю это исключение ArrayStoreException в своем коде для загрузки записей из одной таблицы mysql в другую. Я попытался усечь таблицу назначения и снова запустить мой код, и кажется, что он случайно обнаружил указанное исключение.

Я собирался реализовать DAO на основе (Spring) JdbcTemplate, когда во время модульного тестирования я столкнулся с ArrayStoreException. Я попытался воссоздать его с помощью обычного кода JDBC и все еще сталкиваюсь с ошибкой.

Для моего DDL: Все столбцы имеют тип varchar, за исключением brthdate и дата рождения, которые имеют тип Date. CHARSET ПО УМОЛЧАНИЮ = utf8

Мой фрагмент кода:

 employeesSql = "select id_no, " + 
                "lastname, " + 
                "frstname, " + 
                "mdlename, " +
                "brthdate,sex, " +
                "sss_no, " +
                "tin_no " + 
                "from lms.pms_empf " +
                "where length(trim(id_no)) > 0 " + 
                "and id_no <> '000000' " + 
                " ORDER BY id_no";
        employeeSql = "select count(*) " 
                + "from dim_employees " 
                + "where id_no=?";
        updateSql = "update dim_employees " + 
                "set last_name = ?, " +
                "first_name = ?, " +
                "middle_name = ?, " +
                "birthdate = ?, " +
                "sex = ?, " +
                "sss_no = ?, " +
                "tin_no = ? " +
                "where id_no = ?";
        insertSql = "insert into dim_employees " +
                  "(id_no, last_name, first_name, " +
                  "middle_name,birthdate, sex, sss_no, tin_no) " +
                  "values (?,?,?,?,?,?,?,?)";

        employeesStmt = con.createStatement();
        employeeStmt = con.prepareStatement(employeeSql);
        updateStmt = con.prepareStatement(updateSql);
        insertStmt = con.prepareStatement(insertSql);

        employeesCursor = employeesStmt.executeQuery(employeesSql);

        while (employeesCursor.next()) {

            idNo = new String(employeesCursor.getBytes(1), "UTF-8");
            lastName =  new String(employeesCursor.getBytes(2), "UTF-8");
            firstName = new String(employeesCursor.getBytes(3), "UTF-8");
            middleName = new String(employeesCursor.getBytes(4), "UTF-8");
            birthDate = employeesCursor.getDate(5);
            sex = new String(employeesCursor.getBytes(6), "UTF-8");
            sssNo = new String(employeesCursor.getBytes(7), "UTF-8");
            tinNo = new String(employeesCursor.getBytes(8), "UTF-8");


            employeeStmt.setString(1, idNo);
            employeeCursor = employeeStmt.executeQuery();

            while (employeeCursor.next()) {

                if (employeeCursor.getInt(1) > 0) {
                    //update
                    updateStmt.setString(1, lastName);
                    updateStmt.setString(2, firstName);
                    updateStmt.setString(3, middleName);
                    updateStmt.setDate(4, birthDate);
                    updateStmt.setString(5, sex);
                    updateStmt.setString(6, sssNo);
                    updateStmt.setString(7, tinNo);
                    updateStmt.setString(8, idNo);

                    updateStmt.executeUpdate();
                    updateStmt.executeUpdate();
                }
                else {
                    //insert
                    insertStmt.setString(1, idNo);

                    insertStmt.setString(2,lastName);
                    insertStmt.setString(3, firstName);
                    insertStmt.setString(4, middleName);
                    insertStmt.setDate(5, birthDate);
                    insertStmt.setString(6, sex);
                    insertStmt.setString(7, sssNo);
***//exception points here**        insertStmt.setString(8, tinNo);

                    insertStmt.executeUpdate();
                    insertStmt.clearParameters();
                }

            }

            employeeStmt.clearParameters();

Трассировка стека:

......
Caused by: java.lang.ArrayStoreException
at java.lang.String.getChars(String.java:854)
at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4520)
......
    at com.vdc.lmsprocs.EmployeeProc.setEmployees(EmployeeProc.java:135)
......

Извините за длинный пост. Я явно не мог достаточно хорошо объяснить, что здесь произошло. Я впервые столкнулся с таким недостатком.

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

...