Java JDBC executeBatch - PullRequest
       1

Java JDBC executeBatch

0 голосов
/ 06 июня 2018

Я пытаюсь выполнить много команд INSERT в моей базе данных.

try{
    int Records[];
    Statement title = write.getConnection().createStatement();
    Title titleFilter = application.Title.getTitle();
    ResultSet rs = titleFilter.getTitleData();

    while(rs.next()){;
        String add = ("INSERT INTO title VALUES ("
                + "'" + rs.getInt(1) + "'"+","
                + "'" +rs.getString(2)+ "'" +","
                + "'" +rs.getString(3) + "'"+","
                + "'" +rs.getInt(4)+ "'" +","
                + "'" +rs.getInt(5)+ "'" +","
                + "'" +rs.getInt(6) + "'"+","
                + "'" +rs.getString(7)+ "'" +","
                + "'" +rs.getInt(8) + "'"+","
                +"'" + rs.getInt(9)+ "'" +","
                + "'" +rs.getInt(10)+ "'" +","
                + "'" +rs.getString(11)+ "'" +","
                +"'" + rs.getString(12) + "'"+")"
        );
        title.addBatch(add);
        System.out.println(add);
        title.executeBatch();
    }

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

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

org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
  Position: 48
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2310)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2023)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:217)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:421)
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:318)....

1 Ответ

0 голосов
/ 06 июня 2018

Во-первых, вы должны использовать PreparedStatement;это поможет вам избежать синтаксических ошибок (которые трудно увидеть при объединении Java String s) среди прочего.Во-вторых, вы выполняете пакет для каждого цикла, который не использует цель использования пакета.

Вот пример использования PreparedStatement:

String sql = "INSERT INTO title VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement title = write.getConnection().prepareStatement(sql);
     ResultSet rs = titleFilter.getTitleData()) {

    while (rs.next()) {
        title.setInt(1, rs.getInt(1));
        title.setString(2, rs.getString(2));
        // ... do this for all the parameters ...

        title.addBatch(); // add to batch and move to next loop (if rs.next() returns true)
    }

    title.executeBatch(); // executed after loop

} catch (SQLException ex) {
    ex.printStackTrace(); // or do what you need to when an error occurs
}

В этом примере также используется try-with-resources .

Редактировать:

Как уже упоминалось в комментариях Ивана, может быть лучше выполнять пакет после каждого X записей.Я оставлю код для этого как «упражнение для читателя».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...