Heim >Datenbank >MySQL-Tutorial >Wie löse ich „java.sql.SQLException: Vorgang nach dem Schließen von ResultSet nicht zulässig'?

Wie löse ich „java.sql.SQLException: Vorgang nach dem Schließen von ResultSet nicht zulässig'?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-03 14:21:13269Durchsuche

How to Solve

ResultSet-Wiederverwendungslösung für „java.sql.SQLException: Operation nicht zulässig, nachdem ResultSet geschlossen wurde“

Bei der Begegnung mit „java.sql. Der Fehler „SQLException: Vorgang nach ResultSet geschlossen nicht zulässig“ weist darauf hin, dass mehrere Ergebnismengen gleichzeitig vom selben Anweisungsobjekt verwendet werden. Dies verstößt gegen die Standarderwartung der Statement-Klasse, die zulässt, dass jeweils nur ein ResultSet geöffnet ist.

Um dieses Problem im bereitgestellten Code zu beheben, sollten die folgenden Schritte unternommen werden:

In der getStuff()-Methode:

  • Das ResultSet-Objekt rs muss nach dem Extrahieren der erforderlichen Daten geschlossen werden, um Konflikte mit den anderen zu vermeiden ResultSets.

Im aufrufenden Code:

  • Das ResultSet-Objekt rs muss ebenfalls geschlossen werden, um seine Zuordnung zum Anweisungsobjekt freizugeben.
  • Ein neues Zum Ausführen der Aktualisierungsabfrage sollte ein PreparedStatement-Objekt erstellt werden. Dadurch wird sichergestellt, dass die ursprünglichen ResultSet-Objekte unberührt bleiben.

Der geänderte Code mit diesen Korrekturen würde wie folgt aussehen:

try {
    //Get some stuff
    String name = "";
    String sql = "SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;";
    ResultSet rs = statement.executeQuery(sql);
    if (rs.next()) {
        name = rs.getString("name");
    }
    rs.close();  // Close the ResultSet 'rs'

    String sql2 = "SELECT `id` FROM  `profiles` WHERE `id` =" + profId + ";";
    ResultSet rs2 = statement.executeQuery(sql2);
    String updateSql = "INSERT INTO `blah`............";
    PreparedStatement pst = (PreparedStatement) connection.prepareStatement(updateSql);

    while (rs2.next()) {
        int id = rs2.getInt("id");
        int stuff = getStuff(id);

        pst.setInt(1, stuff);
        pst.addBatch();
    }
    rs2.close();  // Close the ResultSet 'rs2'

    pst.executeBatch();

} catch (Exception e) {
    e.printStackTrace();
}

private int getStuff(int id) {

    try {
        String sql = "SELECT ......;";
        ResultSet rs = statement.executeQuery(sql);

        if (rs.next()) {
            int result = rs.getInt("something");
            rs.close();  // Close the ResultSet 'rs' in 'getStuff' method
            return result;
        }
        return -1;
    }//code continues
}

Durch die Implementierung dieser Änderungen stellt der Code sicher, dass alle ResultSets betroffen sind ordnungsgemäß geschlossen, wodurch der Fehler „java.sql.SQLException: Vorgang nach ResultSet geschlossen nicht zulässig“ verhindert wird.

Das obige ist der detaillierte Inhalt vonWie löse ich „java.sql.SQLException: Vorgang nach dem Schließen von ResultSet nicht zulässig'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn