我正在尝试在数据库中以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。错误在哪里?
答案 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
实例的实际类名。