Не удается сохранить двоичный файл с помощью setBinaryStream в postgreSQL с использованием подготовленного оператора Java

У меня есть код для сохранения двоичного файла в PostgreSQL, я использую JDK 1.5. но у меня ошибка..

И после того, как я напечатаю оператор вставки, я попробую в своей консоли postgresql что-то вроде этой ошибки:

Не удается сохранить двоичный файл с помощью setBinaryStream в postgreSQL с использованием подготовленного оператора Java

File file = new File("E:\\myimage.gif");
FileInputStream fis;

try {
    fis = new FileInputStream(file);
    PreparedStatement ps = conn.prepareStatement("INSERT INTO golf_fnb.coba VALUES (?)");
    ps.setBinaryStream(1, fis, (int)file.length());
    System.out.println("SQl: "+ps);
    ps.executeUpdate();
    ps.close();
    fis.close();
} catch (FileNotFoundException e2) {
    // TODO Auto-generated catch block
    e2.printStackTrace();
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

и это ошибка в моей консоли eclipse:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "\"

    at org.postgresql.util.PSQLException.parseServerError(PSQLException.java:139)
    at org.postgresql.core.QueryExecutor.executeV3(QueryExecutor.java:152)
    at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:100)
    at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:43)
    at org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:517)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:50)
    at org.postgresql.jdbc1.AbstractJdbc1Statement.executeUpdate(AbstractJdbc1Statement.java:273)
    at finger.ConsoleUserInterfaceFactory$ConsoleUserInterface.verify4(ConsoleUserInterfaceFactory.java:605)
    at finger.ConsoleUserInterfaceFactory$ConsoleUserInterface.run(ConsoleUserInterfaceFactory.java:117)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676)
    at java.lang.Thread.run(Thread.java:595)

@khelwood я обновил свой вопрос

Ruslan Wahyudi 01.04.2019 11:09

Какой тип данных у столбца?

Joakim Danielson 01.04.2019 11:21

@JoakimDanielson BYTEA

Ruslan Wahyudi 01.04.2019 11:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
210
1

Ответы 1

Я думаю, что основная ошибка заключается в использовании столбца. Синтаксис: INSERT INTO TABLE(col1, ...) VALUES(val1, ...).

Это может быть и ты(or someone having a similar problem) intendedОБНОВЛЕНИЕ golf_fnb SET coba = ? ГДЕ id = ?`. Для ВСТАВКИ:

try (FileInputStream fis = new FileInputStream(file);
        PreparedStatement ps = conn.prepareStatement("INSERT INTO golf_fnb(coba) VALUES (?)",
                Statement.RETURN_GENERATED_KEYS)) {
    ps.setBinaryStream(1, fis, (int)file.length());
    System.out.println("SQl: "+ps);
    int updateCount = ps.executeUpdate();
    if (updateCount == 1) {
        try (ResultSet rs = ps.getGeneratedKeys()) {
            if (rs.next()) {
                long id = rs.getLong(1);
                System.out.println("ID " + id);
                return;
            }
        }
     }
} catch (SQLException | IOException e) {
    e.printStackTrace();
}
  • Используется попытка с ресурсами, чтобы закрыть все автоматически.
  • Вставленную запись хотелось бы найти. Предполагая длинный первичный ключ, добавлен getGeneratedKeys.
  • \', апостроф может вызвать некоторые проблемы. Вместо этого, возможно, должен быть \047. Я надеюсь, что это восьмеричное преобразование драйвером исчезнет с новым синтаксисом выше.

Спасибо за ваш ответ, наконец, у меня возникла проблема, что я должен обновить свой драйвер JDBC postgresql.

Ruslan Wahyudi 03.04.2019 08:35

Другие вопросы по теме