# ResultSet closed



## Solna (5. Sep 2008)

Hallo zusammen,

Ich habe ein Problem.
Ich arbeite mit MS Access. 

Hier ist mein code:

```
public void ausführen() throws Exception{
        
        Connection connAc=null;
        Statement state = null;
        ResultSet rset = null;
        
       connAc= getConnection();
       state = connAc.createStatement();
        
        int[]  art = new int[5000];
        int[] menge = new int[5000];
        String[] gr = new String[5000];
        int i=0;
        
       rset = state.executeQuery("Select * from Tabelle");
   
        while(rset.next()){
            art[i]=Integer.parseInt(rset.getObject(1).toString());
            gr[i]=rset.getObject(2).toString();
            menge[i]=Integer.parseInt(rset.getObject(3).toString());
            for(int pos=0; pos<=menge[i]; pos++){
                state.executeUpdate("Insert into Tabelle values("+
                        art[i]+","+"'"+gr[i]+"'"+","+"1)");
            }
            i++;
        }
    }
 private  static Connection getConnection() throws Exception{        
        String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
        String url= "jdbc:odbc:Datenbank";
        String username="";
        String password = "";
        Class.forName(driver);
        return DriverManager.getConnection(url, username, password);
        
    }
```
Und nach dem Ausführen kriege ich so eine Fehlemeldung:

Exception in thread "main" java.sql.SQLException: ResultSet is closed
        at sun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(JdbcOdbcResultSet.java:6646)
        at sun.jdbc.odbc.JdbcOdbcResultSet.next(JdbcOdbcResultSet.java:1249)

Was könnte es sein? Andere Programme laufen gut. Kann den Fehler nicht finden.
Für eine Antwort wäre ich sehr dankbar.


----------



## Solna (5. Sep 2008)

Danke, habe die Lösung gefunden.
!!!
Man muss einfach verschiedene Statements nutzen. So:

```
Statement stmt = conn.createStatement();
Statement stmt2 = conn.createStatement();
 
ResultSet rs = stmt.executeQuery(" SELECT * FROM Tabelle");
while(rs.next(){
   ...
  stmt2.executeUpdate(sql);
}
```


----------



## semi (5. Sep 2008)

@Solna
Versteh mich jetzt bitte nicht falsch, ich mache mich jetzt nicht lustig über dich, bin aber wirklich erstaunt, 
wie viele Fehler man in einem so kleinen Stück Code machen kann. :shock:  :wink: Ich hoffe für dich, es ist nur eine 
Schulaufgabe oder sonstwas unwichtiges.


```
public void ausführen() throws Exception{ #1

        Connection connAc=null;             #2
        Statement state = null;
        ResultSet rset = null;

       connAc= getConnection();
       state = connAc.createStatement();

        int[]  art = new int[5000];         #3
        int[] menge = new int[5000];
        String[] gr = new String[5000];
        int i=0;

       rset = state.executeQuery("Select * from Tabelle"); #4

        while(rset.next()){
            art[i]=Integer.parseInt(rset.getObject(1).toString()); #5
            gr[i]=rset.getObject(2).toString();
            menge[i]=Integer.parseInt(rset.getObject(3).toString());
            for(int pos=0; pos<=menge[i]; pos++){                 #6
                state.executeUpdate("Insert into Tabelle values("+  #7
                        art[i]+","+"'"+gr[i]+"'"+","+"1)");
            }
            i++;
        }
        #8
    }
```

Umlaute in Klassen-, Attribut- und Methodennamen sind uncool.
    throws Exception ist nur noch durch throws Throwable zu topen.
Initialisierung mit null, obwohl paar Zeilen weiter etwas zugewiesen wird
Überflüssige Arrays, die keine ersichtliche Verwendung haben.
    Ausserdem, was passiert, wenn die Query mehr als 5000 Datensätze liefert?
Select Statement, bei dem die selektierten Felder nicht benannt werden.
    Man muss auf der Datenbank nachschauen, was es überhaupt liefert.
Überflüssige Konvertierung, da die Daten vermutlich bereits im korrekten
    Format vorliegen. Kann man aber nicht wissen, siehe #4
    Keine Fehlerbehandlung.
Iteration mit Schleifenvariable, die nicht verwendet wird.
    Abbruchbedingung falsch, wenn Menge das ist, was es vermuten lässt.
Klassischer Fall für PerparedStatement und Batch-Updates.
    Die Anführungszeichen lassen vermuten, dass die Felder in der Datenbank
    vom Typ VARCHAR sind. Wozu dann die Konvertierung in #5?
    Was wird überhaupt eingefügt? Gleiches Problem wie bei #4
Kein Schliessen/Freigabe der Statements, des ResultSets oder gar 
    der Connection. Keine Fehlerbehandlung. Keine Transaktion.
+ noch das Problem, das du bereits gelöst hast.


----------

