# JDBC Hilfe



## Edin (20. Okt 2021)

Hallo zusammen,

ich sammele gerade erste Erfahrung mit JDBC und versuche eine Tabelle zu erzeugen sowie anschließend daraus zu lesen.
Das letztere funktioniert leider nicht und ich verstehe nach längerem grübeln und googeln nicht warum...
Es passiert letztlich nichts und ich der Fehler muss meiner Ansicht nach in den beiden Zeilen liegen:


```
Statement abfrageAnweisung = verbindung.createStatement();
ResultSet ergebnis = abfrageAnweisung.executeQuery("SELECT * FROM UNSERE_HELDEN");
```

Wenn ich versuche irgendetwas aus "ergebnis" zu lesen beispielsweise mit


```
System.out.println(ergebnis.getString(0));
```

bekomme ich, dass hier um die Ohren gehauen: java.sql.SQLException: Ungültiger Cursorstatus; keine aktuelle Zeile.

Kann hier evtl. jemand helfen?


```
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {

    private final static String ERSTELLE_TABELLE_ANWEISUNG = "CREATE TABLE UNSERE_HELDEN ("
            + "ID INT NOT NULL GENERATED BY DEFAULT AS IDENTITY, " + "NAME VARCHAR(32), " + "KLASSE VARCHAR(32),"
            + "CHARISMA INT, " + "STARKE INT," + "AUSDAUER INT," + "ERFAHRUNG INT, " + "PRIMARY KEY (ID) " + ")";

    private static Connection erstelleVerbindung() throws ClassNotFoundException, SQLException {
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        Connection verbindung = DriverManager.getConnection("jdbc:derby:d:datenbanken/helden;create=true");
        return verbindung;
    }

    public static void main(String[] args) {
        try (Connection verbindung = erstelleVerbindung()) {

            DatabaseMetaData metaDaten = verbindung.getMetaData();
            ResultSet tabellen = metaDaten.getTables(null, "APP", "UNSERE_HELDEN", null);

            if (!tabellen.next()) {
                Statement anweisung = verbindung.createStatement();
                anweisung.executeUpdate(ERSTELLE_TABELLE_ANWEISUNG);

                Statement einfuegeAnweisung = verbindung.createStatement();
                einfuegeAnweisung.executeUpdate(
                        "INSERT INTO UNSERE_HELDEN ( NAME, KLASSE, CHARISMA, STAERKE, AUSDAUER, ERFAHRUNG) "
                                + "VALUES ('SchroeDanger', 'Zwergenkrieger', 11, 11, 11, 200)");
                einfuegeAnweisung.executeUpdate(
                        "INSERT INTO UNSERE_HELDEN ( NAME, KLASSE, CHARISMA, STAERKE, AUSDAUER, ERFAHRUNG) "
                                + "VALUES ('Artur', 'Nachtelf', 11, 11, 11, 200)");
                einfuegeAnweisung.close();

                anweisung.close();
            }

            Statement abfrageAnweisung = verbindung.createStatement();
            ResultSet ergebnis = abfrageAnweisung.executeQuery("SELECT ID FROM UNSERE_HELDEN");

            while (ergebnis.next()) {
                String id = ergebnis.getString("ID");
                String name = ergebnis.getString("NAME");
                String klasse = ergebnis.getString("KLASSE");
                int charisma = ergebnis.getInt("CHARISMA");
                int staerke = ergebnis.getInt("STAERKE");
                int ausdauer = ergebnis.getInt("AUSDAUER");
                int erfahrung = ergebnis.getInt("ERFAHRUNG");

                System.out.println("ID: " + id);
                System.out.println("Name: " + name);
            }

            abfrageAnweisung.close();
            ergebnis.close();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}
```


----------



## kneitzel (20. Okt 2021)

Ein ResultSet liest Du Zeile für Zeile. Das ist dann in der Regel eine while Schleife, die auf dem ResultSet next() aufruft. Das gibt true zurück, wenn es noch eine Zeile gibt und schiebt den Cursor auf die neue Zeile.
Dann kannst Du die Elemente lesen.

So ein Beispiel findest Du z.B. unter https://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html


----------



## Edin (20. Okt 2021)

Habe es doch noch selber gefunden. Danke für deinen Input @kneitzel 

Das Problem bei dem Code oben war jedoch der folgende:

1. Schreibfehler in Zeile 12: STARKE statt STAERKE

2. Das Hauptproblem war allerdings, dass die Anweisungen um die Datensätze einzufügen in einem if-Block liegen (Zeile 26) der Prüft, ob die Tabelle bereits existiert. Da die Tabelle bei mir schon existiert wird der Code, um die Datensätze einzufügen dementsprechend nicht aufgerufen und ich habe mich die ganze Zeit gefragt, warum da keine Daten drin sind... Das Problem sitzt wie immer vor dem Computer


----------

