【问题标题】:inconsistent datatypes: expected - got BLOB不一致的数据类型:预期 - 得到 BLOB
【发布时间】:2017-05-08 18:21:39
【问题描述】:

我尝试更新包含 blob 数据类型的表单,但如上所述不断出现错误。这是我在 ItemDao 中更新表单的代码。

public static int update(ItemBean u){
    int status=0;
    try{                
        Connection con=ItemDao.getConnection();
        PreparedStatement ps=con.prepareStatement("update item set category=?,name=?,brand=?,type=?,style=?,colour=?,itemSize=?,width=?,height=?,price=?,gender=?,images=? where itemId=?");

        ps.setString(1,u.getItemId());
        ps.setString(2,u.getCategory());
        ps.setString(3,u.getName());
        ps.setString(4,u.getBrand());
        ps.setString(5,u.getType());
        ps.setString(6,u.getStyle());
        ps.setString(7,u.getColour());
        ps.setString(8,u.getItemSize());
        ps.setString(9,u.getWidth());
        ps.setString(10,u.getHeight());
        ps.setString(11,u.getPrice());
        ps.setString(12,u.getGender());
        ps.setBlob(13,u.getImages());   

        //FileItem images;
        //ps.setBinaryStream(13, (InputStream) u.getImages());

        status=ps.executeUpdate();


    }catch(Exception ex){ex.printStackTrace();}

    return status;
}

这里是堆栈跟踪:

java.sql.SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected - got BLOB

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:208)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1046)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1336)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3694)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1354)
at b.ItemDao.update(ItemDao.java:78)
at org.apache.jsp.editItem_jsp._jspService(editItem_jsp.java:84)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2403)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2392)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

声明 blob 数据类型的正确方法是什么?感谢帮助

【问题讨论】:

  • 以正确的顺序为准备好的语句应用参数是有意义的。还是您计划将图像设置为您的itemId
  • @Tom 是的,这是我的计划,因为我想根据 itemId 更新当前数据。
  • 所以您的计划是将 itemId 设置为“category”,将 category 设置为“name”,将 name 设置为“brand”等,然后在 itemId=? 的 where 子句中使用图像 blob?对不起,但这一点意义都没有。
  • @Tom 抱歉,但我不明白。那么,我应该如何为准备好的语句应用参数?
  • 您认为每个ps.setX 电话中的号码的用途是什么?这怎么可能与您的查询有关?

标签: java oracle jdbc


【解决方案1】:

EDIT 正如@Tom 所说,你的另一个问题是索引没有正确分配。所有占位符? 从 1 开始一直到末尾,这包括 where 子句中的占位符。

                     index
update item set
category=?,...........1......ps.setString(1,u.getCategory());
name=?,...............2......ps.setString(2,u.getName());
brand=?,..............3......ps.setString(3,u.getBrand());
type=?,...............4......ps.setString(4,u.getType());
style=?,..............5......ps.setString(5,u.getStyle());
colour=?,.............6......ps.setString(6,u.getColour());
itemSize=?,...........7......ps.setString(7,u.getItemSize());
width=?,..............8......ps.setString(8,u.getWidth());
height=?,.............9......ps.setString(9,u.getHeight());
price=?,.............10......ps.setString(10,u.getPrice());
gender=?,............11......ps.setString(11,u.getGender());
images=?.............12......ps.setBlob(12,u.getImages()); 
where itemId=?.......13......ps.setString(13,u.getItemId());

更正索引后,您可以更正 .getImages() 仍然存在的 blob 问题,除非它是 javax.sql.Blob 类型。

查看文档:https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#setBlob(int,%20java.sql.Blob)

请参阅此question,了解如何使用 Blob 类型。

1) 创建 BLOB 使用 Connection.createBlob

2) 将 BLOB 写入 DB 使用 PreparedStatement.setBlob

3) 从数据库中读取 BLOB 使用 ResultSet.getBlob

【讨论】:

  • @anan 我很惊讶你接受了这个答案,因为它没有解决你的代码中显示的实际问题。
  • @MarkRotteveel 我正在使用 javax.sql.Blob 类型。它有什么问题?
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 2021-06-18
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2021-10-12
相关资源
最近更新 更多