Java JDBC MySQL异常:“;结果集关闭后不允许操作”;

Java JDBC MySQL异常:“;结果集关闭后不允许操作”;,java,mysql,jdbc,Java,Mysql,Jdbc,因此,我通过函数查看了好几次,似乎没有任何错误。我没有向函数传递任何结果集,所以我真的不知道它有什么问题。但我还是犯了一个错误。代码工作得很好,只是该函数被使用了很多次,并且在控制台上错误看起来不太好 void addItemToBody(String userId, MessageReceivedEvent event, int id) throws HTTP429Exception, DiscordException, MissingPermissionsException{

因此,我通过函数查看了好几次,似乎没有任何错误。我没有向函数传递任何结果集,所以我真的不知道它有什么问题。但我还是犯了一个错误。代码工作得很好,只是该函数被使用了很多次,并且在控制台上错误看起来不太好

    void addItemToBody(String userId, MessageReceivedEvent event, int id) throws HTTP429Exception, DiscordException, MissingPermissionsException{
    String sql = "SELECT ItemType FROM items WHERE ID=?";
    PreparedStatement state;
    try {
        state = Main.conn.prepareStatement(sql);
        state.setInt(1, id);
        ResultSet result = state.executeQuery();
        while(result.next()){
            String type = result.getString("ItemType");
            if(type.equals("Head")){
                state.executeUpdate("UPDATE body SET headID="+id+" WHERE playerID='"+userId+"'");
            }
            if(type.equals("Chest")){
                state.executeUpdate("UPDATE body SET chestID="+id+" WHERE playerID='"+userId+"'");
            }
            if(type.equals("Pants")){
                state.executeUpdate("UPDATE body SET pantsID="+id+" WHERE playerID='"+userId+"'");
            }
            if(type.equals("Boots")){
                state.executeUpdate("UPDATE body SET bootsID="+id+" WHERE playerID='"+userId+"'");
            }
            if(type.equals("Melee")||type.equals("Magic")||type.equals("Ranged")){
                state.executeUpdate("UPDATE body SET weaponID="+id+" WHERE playerID='"+userId+"'");
            }
            sendMessage("Item equipped!",event);
            result.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
这就是错误:

java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:743)
at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6320)
at martacus.mart.bot.rpg.InventoryHandler.addItemToBody(InventoryHandler.java:143)
at martacus.mart.bot.rpg.InventoryHandler.equipItem(InventoryHandler.java:92)
at martacus.mart.bot.rpg.InventoryHandler.OnMesageEvent(InventoryHandler.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sx.blah.discord.handle.EventDispatcher.dispatch(EventDispatcher.java:104)
at sx.blah.discord.api.internal.DiscordWS.messageCreate(DiscordWS.java:323)
at sx.blah.discord.api.internal.DiscordWS.onMessage(DiscordWS.java:144)
at org.java_websocket.client.WebSocketClient.onWebsocketMessage(WebSocketClient.java:312)
at org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:368)
at org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:157)
at org.java_websocket.client.WebSocketClient.interruptableRun(WebSocketClient.java:230)
at org.java_websocket.client.WebSocketClient.run(WebSocketClient.java:188)
at java.lang.Thread.run(Unknown Source)

当您仍在循环时,不应关闭
ResultSet

while(result.next()){
    ...
    result.close();
}

当您仍在循环时,不应关闭
ResultSet

while(result.next()){
    ...
    result.close();
}

比我快2秒!即使这样做了,在同一语句对象上执行另一个查询(如代码中的“完成”)也应该关闭
ResultSet
。看也比我快了2秒!即使这样做了,在同一语句对象上执行另一个查询(如代码中的“完成”)也应该关闭
ResultSet
。另请参见@wero对于解决当前问题是正确的-但进一步优化将是使所有更新查询都作为预处理语句well@SnakeDoc是的,我现在这么做了,我以前也这么做过,但现在我换了。谢谢:P@wero对于解决您当前的问题是正确的,但是进一步的优化将是使您的所有更新查询都是PreparedStatementswell@SnakeDoc是的,我现在这么做了,我以前也这么做过,但现在我换了。谢谢:P