2017-05-07 86 views
0

我試圖更新一個包含blob數據類型的表單,但不斷收到上面提到的錯誤。這裏是我的代碼,用於更新ItemDao中的表單。數據類型不一致:預期 - 得到BLOB

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; 
} 

這裏是stacktrack:

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數據類型的正確方法?謝謝你的幫助

+0

以正確的順序爲準備好的陳述應用參數是有意義的。還是你計劃將圖像設置爲你的'itemId'? – Tom

+0

@Tom是的,這是我的計劃,因爲我想根據itemId更新當前數據。 – anan

+1

因此,您的計劃是將itemId設置爲「category」,將category設置爲「name」,將名稱設置爲「brand」等,然後在where子句中對itemId =?'使用圖像blob。對不起,但這並沒有一點意義。 – Tom

回答

0

編輯作爲@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()除非它是一個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),以從DB使用ResultSet.getBlob讀BLOB

+1

感謝您的參考.. – anan

+1

@anan我很驚訝您接受此答案,因爲它沒有解決您的代碼中顯示的實際問題。 –

+0

@MarkRotteveel我正在使用javax.sql。 Blob類型,它有什麼問題? – anan

相關問題