将Blob提交到数据库有什么错误?

时间:2019-06-13 14:27:54

标签: java web servlets apache-commons apache-commons-fileupload

我正在尝试在数据库中以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”。在Db中,所讨论的列的类型为“ oid”。

我得到斑点的代码:

        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,Servlet和JSP和PostGres。错误在哪里?

1 个答案:

答案 0 :(得分:0)

仅部分答案。

您正在生成这样的SQL语句:

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

由于logo被声明为Blob,因此在生成SQL时将调用Blob.toString()Blob的javadocs没有指定toString()方法的作用,但是不太可能将Blob渲染成SQL语言中有意义的东西。根据您看到的错误消息,我猜想它实际上是在使用Object::toString()渲染对象,其中将包括您当时使用的Blob实例的实际类名。