2013-04-15 10 views
7

qualcuno ha idea di cosa sto facendo male qui? Sto cercando di inserire un blob (che contiene un pdf nel caso che importi) in un db oracle insieme ad alcune informazioni aggiuntive. Sto usando un PreparedStatementNullPointerException quando si esegue PreparedStatement su DB Oracle per inserire Blob

Codice:

public void saveReportErgebnis(int reportId, Date erzeugung, int archiv, 
     Blob pdf, String kommentar) throws Exception { 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    byte[] tmp = new byte[(int) pdf.length()]; 
    if(kommentar == null){ 
     kommentar = ""; 
    } 

    SimpleDateFormat erstellungSdf = new SimpleDateFormat(
      "yyyy-MM-dd HH:mm:ss"); 

    try { 
    pdf.getBinaryStream().read(tmp); 

    oracle.sql.BLOB oracleBlob = new oracle.sql.BLOB((OracleConnection) getConnection(), tmp); 
    PreparedStatement prepStmt = getRTTDBHandler() 
      .createPreparedStatement(
        "INSERT INTO reportergebnis(report_id, erzeugung, archiv, pdf, kommentar) VALUES (?,?,?,?,?)"); 
    System.out.println("debug 2 oracle"); 
     prepStmt.setInt(1, reportId); 
     prepStmt.setString(2, formatDateString(erstellungSdf.format(erzeugung))); 
     prepStmt.setInt(3, archiv); 
     prepStmt.setBlob(4, oracleBlob); 
     prepStmt.setString(5, kommentar); 
     prepStmt.execute(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     loghandler.error(e.toString()); 
     throw e; 
    } 

} 

(formatCode sta mettendo la data nella giusta forma, ad esempio per un ritorno:
data to_date ('2013/04/15 09:34:38 ', 'aaaa-mm-gg HH24: mi: ss')

Quando il PrepStatement viene eseguito ottengo la seguente eccezione:

{java.lang.ArrayIndexOutOfBoundsException 
     at java.lang.System.arraycopy(Native Method) 
     at oracle.jdbc.driver.DatumBinder.bind(OraclePreparedStatement.java:18279) 
     at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:3137) 
     at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2355) 
     at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3579) 
     at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3685) 
     at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1088) 
     at com.nundp.mc.modules.regressionsTest.db.OracleRTTDBHandler.saveReportErgebnis(OracleRTTDBHandler.java:963) 
     at com.nundp.mc.modules.regressionsTest.report.ReportController.executeReport(ReportController.java:237) 
     at org.apache.jsp.jsp.modules.Testszenario.ReportHandler_jsp._jspService(ReportHandler_jsp.java:156) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630) 
     at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:535) 
     at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:472) 
     at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968) 
     at org.apache.jsp.jsp.McFrame_jsp._jspService(McFrame_jsp.java:284) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
     at java.lang.Thread.run(Thread.java:619)} 

ho un m utilizzando Oracle Database 10g versione 10.2.0.3.0. Aiuto per favore!

+0

Che cos'è la riga 963 del file 'OracleRTTDBHandler'? –

+0

prepStmt.execute(); – olkoza

+0

Forse [questo] [1]. [1]: http://stackoverflow.com/questions/277744/jdbc-oracle-arrayindexoutofboundsexception Spero che questo aiuti, Yaron –

risposta

0

Provare a utilizzare la funzione * createTemporary (yourConnection, false, oracle.sql.BLOB.DURATION_CALL) * su oracle.sql.BLOB per creare l'istanza. Dopodiché usa semplicemente setBytes (...) per impostare il suo contenuto.

0

Un'osservazione: prepStmt.setDate(2, erzeugung); è più semplice.

mi sarei aspettato un semplice:

InputStream blobIS = pdf.getBinaryStream(); 
prepStmt.setBlob(4, blobIS, pdf.length()); 

... pdf.free(); 
1

Nella mia app ho usato un File invece di un Blob per l'ingresso metodo e hanno fatto il BLOB inserire in questo modo:

public void insertBlob(String filedesc, File file) { 
    Connection con = DriverManager.getConnection(url, username, password); 

    InputStream input = new FileInputStream(file); 

    PreparedStatement pstmt = con.prepareStatement(
     "insert into schema.table values(?,?)"); 
    pstmt.setString(1, filedesc); 
    pstmt.setBinaryStream(2, input); 

    pstmt.execute(); 
} 

Forse avrai bisogno di un po 'di try-catch, ma spero che questo ti possa aiutare.

+0

+1. Nella mia esperienza, l'utilizzo di setBinaryStream() funziona molto meglio di qualsiasi altra alternativa –

0

penso che si deve fare alcuni controlli sanitari prima di utilizzare setBlob()

  1. controllo il numero di parametri nella tabella db
  2. controllare la posizione per il blob.

Tuttavia, si consiglia di memorizzare solo gli URL nel database anziché memorizzare i dati binari del file.

0

Per i ricercatori futuri, questo è come ho risolto il problema blob:

public void saveReportErgebnis(int reportId, Date erzeugung, int archiv, 
     Blob pdf, String kommentar) throws Exception { 

    byte[] tmp = new byte[(int) pdf.length()]; 
    if (kommentar == null) { 
     kommentar = ""; 
    } 

    try { 
     pdf.getBinaryStream().read(tmp); 
     PreparedStatement prepStmt = getRTTDBHandler() 
       .createPreparedStatement(
         "INSERT INTO reportergebnis(report_id, erzeugung, archiv, pdf, kommentar) VALUES (?,?,?,?,?)"); 
     prepStmt.setInt(1, reportId); 
     Timestamp ts = new Timestamp(erzeugung.getTime()); 
     prepStmt.setTimestamp(2, ts); 
     prepStmt.setInt(3, archiv); 
     prepStmt.setBytes(4, tmp); 
     prepStmt.setString(5, "'" + kommentar + "'"); 
     prepStmt.execute(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     loghandler.error(e.toString()); 
     throw e; 
    } 
} 

Grazie mille a tutti per l'aiuto.

Problemi correlati