Я получаю это исключение 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)
......
Извините за длинный пост. Я явно не мог достаточно хорошо объяснить, что здесь произошло. Я впервые столкнулся с таким недостатком.
Заранее спасибо.