# SQL Exception: Cursor position not valid



## rhöner (25. Sep 2008)

Hallo,

ich versuche über eine Datenbankabfrage fünf Felder zu füllen. Man gibt die Kunden-Nr. ein, anschließend auf "suchen" und dann sollen die Felder mit der Adresse gefüllt werden. Ich bekomme aber ständig eine SQLException: Cursor position not valid.
Ich kann aber meinen Fehler nicht finden. Kann mir jemand weiterhelfen?

Hier mein Code:

```
public void onLieferantSuchen (ActionEvent event) {
		Connection con;
		try {
			Class.forName("com.ibm.as400.access.AS400JDBCDriver");
			con=DriverManager.getConnection("jdbc:as400://10.0.1.199;libraries=" + Datenbank , "User", "Password");
			Statement statement=con.createStatement();
			String sql = null;
			sql = "select kdan1, kdstr, kdlort, kdplz, kdlakz from pkunden where kdkonz='xxx' and kdfirm='xxx' and kdkdnr='" + getKdnr() + "' and kdkdli=2";
			ResultSet res = statement.executeQuery(sql);
			setName(res.getString("kdan1"));
			setStrasse(res.getString("kdstr"));
			setPlz(res.getString("kdplz"));
			setOrt(res.getString("kdlort"));
			setLkz(res.getString("kdlakz"));
		}
		catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		}
		catch (SQLException e2) {
			e2.printStackTrace();
		}
		catch (ArrayIndexOutOfBoundsException e3) {
			Statusbar.outputMessage("Kein Datensatz gefunden.");
		}
	}
```


----------



## SlaterB (25. Sep 2008)

in einem ResultSet gibt es 0-n einzelne Ergebnisse,

bevor du mit res.getString("kdan1"); etwas abfragen kannst,
musst du erstmal festlegen, welchen Eintrag du meinst,

man könnte denken, dass initial der erste ausgewählt ist,
das ist aber nicht so, könnte auch gar keiner da sein,
erst muss man next() aufrufen und am besten den boolean-Rückgabewert bedenken

Tutorial?


----------



## rhöner (25. Sep 2008)

Meinst Du so:


```
while (res.next())
{
     setName....
}
```


----------



## SlaterB (25. Sep 2008)

tja, das ist ne Schleife,
ob du ne Schleife willst oder nicht musst du selber wissen,

ich glaube, ich habe mein Anliegen deutlich gemacht:
1x res.next() aufrufen, hier der komplette Code:

res.next();


sorry


----------



## rhöner (25. Sep 2008)

Hat funktioniert, danke!


----------



## sparrow (25. Sep 2008)

Je nach Datenbank steht der Cursor manchmal vor dem ersten Datensatz bei einem ResultSet.
Erfragen kann man das mit rs.isBeforeFirst();

Gruß
Sparrow


----------



## HoaX (26. Sep 2008)

was du noch ändern solltest: 
1) preparedstatement verwenden, so wies jetzt ist kann der benutzer sql-befehle einschleusen
2) du schließt dein resultset/statement/connection nicht
3) ich denke nicht dass das diene einzige db-methode ist oder? schreibst du in jede die zugangsdaten? mach das doch mal zentral, sonst musst du das am ende an 20+ stellen ändern...


----------



## rhöner (1. Okt 2008)

zu
1) preparedstatement sagt mir persönlich gar nix. Hab aber auch noch nicht wirklich lange mit Java bzw. SQL zu tun.
2) wird jetzt geschlossen
3) wird jetzt zentral gemacht

Danke für die Tipps.


----------

