一尘不染

java.sql.SQLException:在mysql中结果集结束后

mysql

我正在尝试从MYSQL下载图像(.png)文件。有时它工作正常。无法找到确切的问题。它可以在Jboss服务器上正常工作。尝试在Apche上的本地计算机中运行时引发错误。

请帮助我修复错误。这是我的Java代码。

    try {
        conection = SQLUtil.createConnection(Constant.DataSourceName);
        st = conection.prepareStatement("SELECT image FROM TABLE_NAME WHERE Userid="+ getUserId());
        result = st.executeQuery();
        result.next();

        if(!result.next()){
        input = result.getAsciiStream(1);
        }
        FileOutputStream output = new FileOutputStream(getSignatureImageDestinationPath());
        int ch = input.read();
        while (ch != -1) {
            output.write((char) ch);
            ch = input.read();
        }
        output.close();
        input.close();
        result.close();
        SQLUtil.closeConnection(conection);
    } catch (Exception e) {
        System.out.println(e+":Error");
    } finally {
        if (st != null) {
            SQLUtil.closeConnection(conection);
        }
    }

这是堆栈跟踪输出:

java.sql.SQLException: After end of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:854)
at com.mysql.jdbc.ResultSetImpl.getAsciiStream(ResultSetImpl.java:1275)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getAsciiStream(DelegatingResultSet.java:253)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getAsciiStream(DelegatingResultSet.java:253)
at com.ninenexus.model.Signature.getSignatureImage(Signature.java:173)
at com.ninenexus.servlets.SaveMySignature.mySignatureDisplay(SaveMySignature.java:69)
at com.ninenexus.servlets.SaveMySignature.doPost(SaveMySignature.java:35)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:380)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

阅读 401

收藏
2020-05-17

共1个答案

一尘不染

您打了result.next()两次电话。我假设您的查询仅返回1行,因为您尝试通过进行匹配Userid。当第二个result.next()被调用时,中没有要返回的行ResultSet。这就是SQLException抛出an的原因。result.next()像这样删除第一个:

result = st.executeQuery();
if(!result.next()){
    input = result.getAsciiStream(1);
    }
2020-05-17