# java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state



## yerl (14. Dez 2011)

Hallo liebe Java-Community,

ich habe schon wieder ein Problem! )
Seit 2 Std. versuche ich es verzweifelt zu lösen, leider ohne Erfolg. 
In meiner Anwendung finden laufend DB-Zugriffe statt. Input ist eine Access-DB.

Hierzu habe ich diese Klasse geschrieben, welche eine DB Verbindung herstellt.


```
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


import javax.swing.JOptionPane;

public class DB_input 
{	
	public String db_pfad;
	
	public String db_pfad_holen()
	{
		Home_URL url = new Home_URL();
		
		db_pfad = url.url_ursprung() + "programmordner/input_db.mdb"; 
		return db_pfad;
	}
	
	public Connection dbzugriff() throws ClassNotFoundException, SQLException, IOException
	{
		try 
		{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        } 
		catch (ClassNotFoundException e) 
		{
			JOptionPane.showMessageDialog(null, "Treiber-Klasse " + e + " konnte nicht geladen werden!", "DB-Zugriffsfehler",JOptionPane.OK_OPTION);
            System.exit(0);
        }
		
		try 
        {
        	Connection con = DriverManager.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" + db_pfad_holen());
        	return con;
        } 
        catch (SQLException e) 
        {
        	JOptionPane.showMessageDialog(null, "Datenbank Verbindungsfehler! " + e, "DB-Zugriffsfehler", JOptionPane.OK_OPTION);
            System.exit(0);
        } 
        return null;
	}
}
```

Soweit so gut! Zusätzlich schreibe ich Methoden mit benötigten Statements.


```
public boolean artikel_existent() throws Exception 
	{	
		DB_input input = new DB_input();
		Connection con = input.dbzugriff();
		Statement stmt = con.createStatement();
		ResultSet rs = null;
		String ant = "";
		
		rs = stmt.executeQuery("SELECT input_db.Dokumentnummer FROM input_db WHERE (((input_db.Artikelnummer)= '"+ tf_artikelnummer.getText() +"') AND ((input_db.Station)= '"+ stationsinfo_array[0]+"'));");  //Alle QP-namen lesen die zur artikelnummer gehören
		
		while(rs.next());
		{
			 ant = rs.getString(1); //Hier tritt der Fehler auf!!!!!!!
			 if(!ant.equals(""))
				 return false;
		}
		
		rs.close();
		con.close();
		return true;
	}
```

In dieser Methode prüfe ich ob eine Dokumentennummer existiert. Aber! Ich kriege immer eine Fehlermeldung in der Zeile: ant = rs.getString(1); 

Es sind ca. 30 Methoden dieser Art in meinem Prog. im Einsatz, es läuft alles einwandfrei bis auf diese.
Mit dem Statement ist auch alles ok, den habe ich an einer anderen Stelle ausprobiert. Die Methode wird in einem ActionListener aufgerufen, nach einem Button KlicK.

Hier die Fehlermeldung:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state
	at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
at Oberflaeche.artikel_existent(Oberflaeche.java:580)
	at Oberflaeche$4.actionPerformed(Oberflaeche.java:886)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Danke im Voraus!!

yerl


----------



## Michael... (14. Dez 2011)

Hier - im letzten Zeichen der Zeile - liegt der Fehler:


yerl hat gesagt.:


> [JAVA=11]while(rs.next())      ;        [/code]



Achtung sehr unschön: wenn die Bedingung in Zeile 14 zutrifft wird die Methode verlassen ohne ResultSet und Verbindung zu schließen, falls sie nicht zutrifft aber schon...


----------



## yerl (14. Dez 2011)

Danke, Danke, Danke!!!! Ich verstehe nicht wie ich so unaufmerksam sein kann und warum dort überhaupt ein semicolon steht... Egal. Ich bedanke mich 1000fach)))).


----------

