2013-04-15 40 views
7

có ai có ý tưởng về những gì tôi đang làm sai ở đây không? Tôi đang cố gắng để chèn một blob (có chứa một pdf trong trường hợp có vấn đề) vào một db oracle cùng với một số thông tin bổ sung. Tôi đang sử dụng PreparedStatementNullPointerException khi thực thi PreparedStatement trên Oracle DB để chèn Blob

Code:

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 là đưa các ngày theo hình thức đúng, ví dụ cho một sự trở lại:
ngày to_date ('2013/04/15 09:34:38 ', 'yyyy-mm-dd hh24: mi: ss')

Khi PrepStatement được thực hiện tôi nhận được ngoại lệ sau:

{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)} 

tôi một m bằng cách sử dụng Oracle Database 10g Release 10.2.0.3.0. Trợ giúp xin vui lòng!

+0

Có gì trên dòng 963 của tệp 'OracleRTTDBHandler'? –

+0

prepStmt.execute(); – olkoza

+0

Có thể [this] [1]. [1]: http://stackoverflow.com/questions/277744/jdbc-oracle-arrayindexoutofboundsexception Hope this helps, Yaron –

Trả lời

0

Hãy thử sử dụng hàm createTemporary (yourConnection, false, oracle.sql.BLOB.DURATION_CALL) * trên oracle.sql.BLOB để tạo cá thể của bạn. Sau đó chỉ cần sử dụng setBytes (...) để thiết lập nội dung của nó.

0

Một nhận xét: prepStmt.setDate(2, erzeugung); đơn giản hơn.

tôi dự kiến ​​sẽ có một đơn giản:

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

... pdf.free(); 
1

Trong ứng dụng của tôi, tôi sử dụng một File thay vì một Blob đối với phương pháp đầu vào và đã làm BLOB chèn theo cách này:

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

lẽ bạn sẽ cần một số try-catch, nhưng tôi hy vọng điều này sẽ giúp bạn.

+0

+1. Theo kinh nghiệm của tôi, sử dụng setBinaryStream() hoạt động tốt hơn nhiều so với bất kỳ lựa chọn thay thế nào –

0

Tôi nghĩ rằng bạn phải làm một số kiểm tra vệ sinh trước khi sử dụng setBlob()

  1. kiểm tra số lượng các thông số trong bảng db của bạn
  2. kiểm tra các vị trí cho blob.

Tuy nhiên, tôi muốn khuyên bạn chỉ nên lưu trữ URl trong cơ sở dữ liệu thay vì lưu trữ dữ liệu nhị phân của tệp.

0

Đối với người tìm kiếm trong tương lai, đây là cách tôi giải quyết vấn đề 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; 
    } 
} 

Thank you very much tất cả mọi người đã giúp đỡ.

Các vấn đề liên quan