Это может быть вызвано только атакой SQL-инъекции файла CSV, который вы читаете.
Другими словами, строка SQL, которую вы объединяете там с непроверенными значениями CSV, могла привести к искаженной строке SQL. Я предлагаю сделать System.out.println()
заполненной строки SQL до ее выполнения, чтобы вы могли проверить, что именно сделало SQL-запрос недействительным.
Вы можете исправить это, выбрав соответствующие значения CSV, но лучшим решением будет использование PreparedStatement
вместо Statement
. Э.Г.
preparedStatement = connection.prepareStatement("INSERT INTO `lastdb`.`" + getMonth() + "" + cal.getInstance().get(Calendar.YEAR)
+ "` (`Name`, `Goal`, `New`, `Used`, `Total`, `Pace`) VALUES (?, ?, ?, ?, ?, ?)");
while ((nextLine = reader.readNext()) != null) {
// ...
preparedStatement.setString(1, nextLine[0]);
preparedStatement.setString(2, nextLine[1]);
preparedStatement.setString(3, nextLine[2]);
preparedStatement.setString(4, nextLine[3]);
preparedStatement.setString(5, nextLine[4]);
preparedStatement.setString(6, nextLine[5]);
preparedStatement.executeUpdate();
}
Он не только экранирует значения столбцов, но и повышает производительность. Вы можете даже улучшить его, используя партии по addBatch()
и executeBatch()
.
while ((nextLine = reader.readNext()) != null) {
// ...
preparedStatement.setString(1, nextLine[0]);
preparedStatement.setString(2, nextLine[1]);
preparedStatement.setString(3, nextLine[2]);
preparedStatement.setString(4, nextLine[3]);
preparedStatement.setString(5, nextLine[4]);
preparedStatement.setString(6, nextLine[5]);
preparedStatement.addBatch();
}
preparedStatement.executeBatch();
Смотри также: