SQL 准备语句异常

SQL Prepared Statement Exception

我无法弄清楚这段代码似乎有什么问题

 public boolean InsertFile(UserUpload userUpload){
    try {
        con = connectToDB();
        stmt = con.prepareStatement("INSERT INTO USERUPLOADS VALUES(?,?,?,?)");
        stmt.setInt(1, getUploadId());
        stmt.setString(2, userUpload.getFileName());
        stmt.setString(3, userUpload.getFilePath());
        stmt.setString(4, userUpload.getUserId());
        stmt.executeUpdate();
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }

我遇到以下异常:

java.sql.SQLException: The column position '2' is out of range.  The number of columns for this ResultSet is '0'.
            at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
            at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
            at org.apache.derby.client.am.ColumnMetaData.getColumnType(Unknown Source)
            at org.apache.derby.client.am.PreparedStatement.setString(Unknown Source)
            at DBConnection.DBConnectionManagerClass.InsertFile(DBConnectionManagerClass.java:139)
            at classes.FileHandlerClass.uploadFile(FileHandlerClass.java:46)
            at com.fileservice.jigar.FileHandlerImpl.uploadFile(FileHandlerImpl.java:26)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:483)
            at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:483)
            at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:483)
            at com.sun.xml.internal.ws.api.server.MethodUtil.invoke(MethodUtil.java:68)
            at com.sun.xml.internal.ws.api.server.InstanceResolver.invoke(InstanceResolver.java:235)
            at com.sun.xml.internal.ws.server.InvokerTube.invoke(InvokerTube.java:134)
            at com.sun.xml.internal.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:73)
            at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:1121)
            at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:1035)
            at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:1004)
            at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:862)
            at com.sun.xml.internal.ws.server.WSEndpointImpl.process(WSEndpointImpl.java:404)
            at com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:706)
            at com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:260)
            at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(WSHttpHandler.java:98)
            at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(WSHttpHandler.java:82)
            at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
            at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83)
            at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:82)
            at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:675)
            at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
            at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:647)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at java.lang.Thread.run(Thread.java:744)
        Caused by: org.apache.derby.client.am.SqlException: The column position '2' is out of range.  The number of columns for this ResultSet is '0'.
            at org.apache.derby.client.am.ColumnMetaData.checkForValidColumnIndex(Unknown Source)
            ... 41 more

尝试使用 prepareCall 而不是 prepareStatement。我一直使用 PreparedStatement pstmt = connection.prepareCall(<SQL>) 并且它适用于许多数据库(尽管我还没有在 Derby 上尝试过)。