В чем заключается ошибка при отправке блобов в БД? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь сделать вставки и обновления изображения в БД, уже в формате BLOB-объектов.

public static boolean alterarLogo(int id, Blob logo) {
            String sql = "update conta set conta_logo = " + logo + " where conta_id = " + id;
            try (Connection conn = ConexaoDBGeral.abre()) {
                if (conn != null) {
                    try (Statement ps = conn.createStatement()) {
                        ps.executeUpdate(sql);
                        return true;
                    }
                }
            } catch (SQLException ex) {
                Logger.getLogger(ContaDAO.class.getName())
                        .log(Level.SEVERE, null, ex);
            }
            return false;
        }

Приведенный выше код вызывает исключение: «неправильное имя (слишком много точечных имен): javax.sql.rowset.serialblob». В БД рассматриваемый столбец имеет тип «oid».

Код, где я получаю BLOB-объект:

        int idEmpresa=-1;
        SerialBlob blob = null;
        byte[] contents;
        try {
            List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
            for (FileItem item : items) {
                if (!item.isFormField()) {
                    // Process form file field (input type="file").
                    String fieldName = item.getFieldName();
                    String fileName = FilenameUtils.getName(item.getName());
                    InputStream file = item.getInputStream();
                    contents = IOUtils.toByteArray(file);
                    try {
                        blob = new SerialBlob(contents);
                    } catch (SQLException ex) {
                        Logger.getLogger(Config.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    ContaDAO.alterarLogo(idEmpresa, blob);
                }
            }
        } catch (FileUploadException e) {

Я использую Java, сервлеты и JSP, а также PostGres. Где ошибка?

1 Ответ

1 голос
/ 14 июня 2019

Частичный ответ только.

Вы генерируете оператор SQL следующим образом:

String sql = "update conta set conta_logo = " + logo + 
    " where conta_id = " + id;

Поскольку logo объявлен как Blob, вы будете вызывать Blob.toString() при создании SQL.В javadocs для Blob не указано, что будет делать метод toString(), но вряд ли можно преобразовать Blob во что-то, что имеет смысл в языке SQL.Основываясь на сообщении об ошибке, которое вы видите, я предполагаю, что он фактически отображает объект, используя Object::toString(), который будет включать фактическое имя класса для экземпляра Blob, который вы используете в тот момент.

...