# SQL Exception Problem



## lackschuh (24. Feb 2010)

Hallo

Ich habe einen neuen Rechner mit Eclipse 3.5 und MYSQL 5.1. Mein Schulprojekt habe ich auf einem alten Rechner mit Eclipse 3.0 und MYSQL 4.1 angefangen. Nun habe ich das Projekt in Eclipse 3.5 importiert und die Klasse für die Datenbankanbindung angepasst. Ich kann auch zugreifen, aber ich habe nun folgendes Problem und komme seit mehreren Tagen nicht mehr weiter.

Wenn ich das Projekt starte, dann kommt in der Konsole folgende Meldung:



> java.sql.SQLException: Before start of result set
> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1072)
> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:986)
> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:981)
> ...



Code für readLastkunde in der DBManager Klasse:

```
public Kunden readLastkunde() {
		Connection verbindung = null;
		try
		{
			verbindung = DBStarter.getConnection();
		} catch (InstantiationException e1)
		{
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try
		{
			verbindung = DBStarter.getConnection();
		} catch (InstantiationException e1)
		{
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		Statement anweisung;
		ResultSet ergebnis;
		Kunden curKunde = null;
		try {
			anweisung = (Statement) verbindung.createStatement();
			ergebnis = (ResultSet) anweisung
					.executeQuery("Select * from kunde order by createtime desc limit 1");
			curKunde = new Kunden();

			curKunde.setTitel(ergebnis.getString("titel"));
			curKunde.setName(ergebnis.getString("name"));
			curKunde.setVorName(ergebnis.getString("vorname"));
			curKunde.setStrassenNr(ergebnis.getString("strassennr"));
			curKunde.setPlz(ergebnis.getString("plz"));
			curKunde.setOrt(ergebnis.getString("ort"));
			curKunde.setTel(ergebnis.getString("tel"));
			curKunde.setHandy(ergebnis.getString("handy"));
			String geschl = ergebnis.getString("geschlecht");
			if (geschl != null)
				if (geschl.equals("1"))
					curKunde.setGeschlecht(true);
				else
					curKunde.setGeschlecht(false);

			SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
			String geb = ergebnis.getString("geburtsdatum");
			if (geb != null)
				curKunde.setGeburtsdatum(format.parse(geb));

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParseException p) {
			// TODO Auto-generated catch block
			p.printStackTrace();
		}
		return curKunde;
	}
```


Code DBStarter:

```
public class DBStarter
{
    
    private static Connection curConnection = null;    

    public static  Connection getConnection() throws InstantiationException
    {
        if (curConnection == null)
        {
            
            try
            {
            	Class.forName("com.mysql.jdbc.Driver");
        		
        		// Connection herstellen
        		String tTreiber ="jdbc:mysql:";
        		String tServer  ="localhost";
        		String tPort    ="3306";
        		String tSchema  ="schulprojekt";
        		String tUser    ="root";
        		String tPasswort ="";
        		
        		String tConnectionString = tTreiber + "//" + tServer + ":" + tPort + "/" + tSchema;
            	
            	
                curConnection = DriverManager.getConnection(tConnectionString, tUser, tPasswort);
            
            } 
            
            catch (ClassNotFoundException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            catch (SQLException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        return curConnection;
    }
  
}
```

Wenn ich aber den Kundenerfassungsdialog von JInternalFrame in ein JFrame ändere und ihn seperat über einen Starter aufrufe, dann kann ich zwar alle Kunden lesen, jedoch erscheint in der Konsole folgende Fehlermeldung:



> java.sql.SQLException: Before start of result set
> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1072)
> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:986)
> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:981)
> ...



Für Hilfe wäre ich sehr dankbar.
MFG


----------



## SlaterB (24. Feb 2010)

bevor man auf ein ResultSet zugreift muss man mindestens einmal next() aufrufen


----------



## lackschuh (24. Feb 2010)

Ok, vielen Dank. 

1. Dann hat es also mit der Klasse DBStarter nichts zu tun?
2. Das mit dem next() aufrufen kapiere ich noch nicht so ganz. Hast du eventuell gerade einen Link zur Hand, wo dieses Thema für Anfänger verständlich erläutert wird?

mfg


----------



## SlaterB (24. Feb 2010)

Getting Data from a Result Set | Example Depot

überall sieht man die next()-Aufrufe, 
ein Lehrbuch zu ResultSet mit offiziellen Erklärungen hast du doch hoffentlich sicher selber

edit:
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 23.6 Datenbankabfragen
> 23.6.2 Ergebnisse einer Abfrage in ResultSet


----------



## lackschuh (1. Mrz 2010)

Hallo
irgendwie habe ich das mit dem next() noch nicht so raus. Wo liegt hier der Fehler. Also wenn ich den Inhalt einer DB-Tabelle lese bzw. alle Zeilen gelesen wurde und es wieder von vorne beginnt, dann erhalte ich wieder den gleichen Fehler:


> java.sql.SQLException: Before start of result set
> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1072)
> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:986)
> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:981)
> ...



[JAVA=215]	public Object readObject(Pkws curPkw) {
		ResultSet ergebnis;

		try {			
			ergebnis = SingletonErgebnis.get("pkw");			
			curPkw = new Pkws();

			if (ergebnis.next());
			else
			{
				SingletonErgebnis.set();
				ergebnis = SingletonErgebnis.get("pkw");				
			}

			Class objectClass = curPkw.getClass();
			java.lang.reflect.Method[] methoden = objectClass.getMethods();
			String spaltenNamen = "";
			String attribute = "";

			for (int i = 0; i < methoden.length; i++) {
				if (methoden_.getName().contains("set")) {
					String name = methoden.getName();
					if (!name.equals("setClass")) {
						Object[] array = new Object[1];
//Hier unten wird der Fehler angezeigt, wenn der Durchlauf beendet ist und es von neuem beginnt.
						array[0] = ergebnis.getString(name.substring(3));
						System.out.println("Führe Methode aus auf : "
								+ methoden.toString());
						System.out.println("Mit Parameter : "
								+ array[0].toString());

						if (methoden.toString().indexOf("etriebe") > 0)
							if (((String) array[0]).compareTo("0") > 0)
								array[0] = new Boolean(false);
							else
								array[0] = new Boolean(true);

						if (methoden.toString().indexOf("mStand") > 0)
							array[0] = new Integer((String) array[0]);

						if (methoden.toString().indexOf("prit") > 0)
							array[0] = new Integer((String) array[0]);						

						if (methoden.toString().indexOf("reis") > 0)
							array[0] = new Integer((String) array[0]);

						if (methoden.toString().indexOf("aufDatum") > 0)
						{
							DateFormat df2 = DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.GERMANY);
							try {
								array[0] = df2.parse((String) array[0]);
							} catch (ParseException e) {
								e.printStackTrace();
							}}


						if (methoden.toString().indexOf("rstZulassung") > 0) 

						{
							DateFormat df = DateFormat.getDateInstance(
									DateFormat.DEFAULT, Locale.GERMANY);
							try {
								array[0] = df.parse((String) array[0]);
							} catch (ParseException e) {
								e.printStackTrace();
							}
						}
						try {
							methoden.invoke(curPkw, array);
							System.out.println("############ Methode " + methoden.getName());

						} catch (IllegalArgumentException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						} catch (IllegalAccessException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						} catch (InvocationTargetException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return curPkw;
	}[/code]_


----------



## Michael... (1. Mrz 2010)

erst next aufrufen, dann auslesen:

```
ResultSet rs ...
while rs.next() {
    rs.get(...);
}
```


----------



## SlaterB (1. Mrz 2010)

wird das else in Zeile 23 aktiv (loggen, debuggen)?
anscheinend kommt von Zeile 226 ein neues ResultSet und bis Zeile 239 sehe ich nirgendwo einen next()-Aufruf,
ist ja nicht so schwer, einfach z.B. in Zeile 227 ergebnis.next(), wie du es schon in Zeile 222 hast,

ob und warum da vielleicht noch ein if/ else dazugehört, was du in allen Fällen machen solltest, könntest, dürftest, 
will ich dabei gar nicht mal interpretieren,

nur nach wie vor auf eine extrem einfache Regel hinweisen: bevor nicht next() aufgerufen wird kein getString(),
müsste zu merken sein, oder?


----------



## lackschuh (1. Mrz 2010)

SlaterB hat gesagt.:


> wird das else in Zeile 23 aktiv (loggen, debuggen)?
> anscheinend kommt von Zeile 226 ein neues ResultSet und bis Zeile 239 sehe ich nirgendwo einen next()-Aufruf,
> ist ja nicht so schwer, einfach z.B. in Zeile 227 ergebnis.next(), wie du es schon in Zeile 222 hast,



Super, danke, ihr seid die Besten. Nachdem ich in Zeile 227 ein next() hinzu gefügt habe, läuft es wunderbar durch.


----------

