Probleme mit Datenbankabfragen.

Kai008

Erfahrenes Mitglied
Ich wusste jetzt nicht ob das in Datenstrukturen oder hierher gehört, also sorry wenn ich falsch liege.
Ich wollte Teile eines Programms in eine Access-DB auslagern.
Nur ich erhalte nur bei den ersten 2 Ergebnissabfragen Werte zurück, danach nichts mehr:

Code:
con_unitinfos = access_connect("tb.mdb");

Code:
public Connection access_connect(String filename)
{
	try
    	{
    		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + filename,"","");
	}
    	catch (ClassNotFoundException e1) {}
	catch (SQLException e) {}
	catch (Exception e) {}
	return con;
}

Code:
public void init(int konstruktorpos, String konstruktortyp)
{
	if(Integer.parseInt(konstruktortyp) <= 29)
	{
		this.typ = Integer.parseInt(konstruktortyp);
		this.zugehoerigkeit = 0;
	}
	else if(Integer.parseInt(konstruktortyp) >= 30)
	{	
		konstruktortyp = String.valueOf(Integer.parseInt(konstruktortyp) - 29);
		this.typ = Integer.parseInt(konstruktortyp) - 29;
		this.zugehoerigkeit = 1;
	}
			
	try
	{
		rs = con_unitinfos.createStatement().executeQuery("SELECT * FROM Einheiteninfos WHERE ID = " + konstruktortyp);

		while(rs.next())
		{
			this.pos = konstruktorpos;
			this.name = rs.getString("Name");
			this.maxhp = rs.getInt("HP"); //Name und HP empfange ich noch
			this.hp = rs.getInt("HP"); //Diese Variable wird nichtmehr gesetzt.
			this.maxammo = rs.getInt("Ammo");
			this.ammo = rs.getInt("Ammo");
			this.maxfuel = rs.getInt("Fuel");
			this.fuel = rs.getInt("Fuel");
			this.zugreichweite = rs.getInt("Zugreichweite");
			this.gefahren = 0;
			this.gefeuert = 0;
			this.fortbewegungstyp = rs.getInt("Fortbewegungstyp");
		}
	} catch (SQLException e){}
}

Kann mir bitte wer sagen warum ich nur die ersten 2 Ergebnisse bekomme?
Und das obwohl HP und MaxHP ja die selbe Abfrage hat.
 
Bitte vorher die API lesen.

java.sql.ResultSet

The ResultSet interface provides getter methods (getBoolean, getLong, and so on) for retrieving column values from the current row. Values can be retrieved using either the index number of the column or the name of the column. In general, using the column index will be more efficient. Columns are numbered from 1. For maximum portability, result set columns within each row should be read in left-to-right order, and each column should be read only once.
 
Danke, aber ich kann nicht besonderst gut Englisch.
Heißt das das ich immer von Links nach Rechts die Spalten auslesen und jedes mal eine neue Query senden soll?
 
Du fängst bei dir Exception gibst sie aber nie aus. Ich denke bei dir wird eine Exception aufgetreten sein. So sollte es zumindest aussehen wenn du die Exception schon nicht behandeln willst:
Java:
catch (SQLException e){
    e.printStackTrace();
}

Ebenso für die anderen Exceptions.
 
Danke, aber ich kann nicht besonderst gut Englisch.
Heißt das das ich immer von Links nach Rechts die Spalten auslesen und jedes mal eine neue Query senden soll?

Nicht ganz. Du sollst sie Spalten von links nach rechts auslesen UND auf jede Spalte nur einmal zugreifen.

Java:
public void init(int konstruktorpos, String konstruktortyp)
{
	if(Integer.parseInt(konstruktortyp) <= 29)
	{
		this.typ = Integer.parseInt(konstruktortyp);
		this.zugehoerigkeit = 0;
	}
	else if(Integer.parseInt(konstruktortyp) >= 30)
	{	
		konstruktortyp = String.valueOf(Integer.parseInt(konstruktortyp) - 29);
		this.typ = Integer.parseInt(konstruktortyp) - 29;
		this.zugehoerigkeit = 1;
	}
			
	try
	{
		rs = con_unitinfos.createStatement().executeQuery("SELECT * FROM Einheiteninfos WHERE ID = " + konstruktortyp);

		while(rs.next())
		{
			int health = rs.getInt("HP");
			int ammo = rs.getInt("Ammo");
			int fuel = rs.getInt("Fuel");

			this.pos = konstruktorpos;
			this.name = rs.getString("Name");
			this.maxhp = health;
			this.hp = health;
			this.maxammo = ammo;
			this.ammo = ammo;
			this.maxfuel = fuel;
			this.fuel = fuel;
			this.zugreichweite = rs.getInt("Zugreichweite");
			this.gefahren = 0;
			this.gefeuert = 0;
			this.fortbewegungstyp = rs.getInt("Fortbewegungstyp");
		}
	} catch (SQLException e){}
}

Und lass die Exceptions nicht einfach versacken. Ein

Java:
	} catch(SQLException e) {
		e.printStackTrace(System.err);
	}

sollte zumindestens drin sein.
 
Danke, jetzt funktioniert es.
Ich frage die Exceptions nur ab wenn es nicht so läuft wie ich will, so wie hier, hab leider vergessen zu erwähnen das es zu keiner gekommen ist.
Weil ich mir dachte wenn es erst einmal richtig läuft kommt es doch eigendlich eh nicht mehr zu Fehlern, oder? Oder maximal wenn jemand eine Datei löscht oder so und es das Programm nicht findet, aber dann läuft es eh kaum noch brauchbar und der Anwender merkt dass das (s)ein Fehler war.
 
Richtig normalerweise kommt es nicht zu Exceptions daher ist es auch nicht störend wenn man die Fehlerausgaben drin läßt. Sie helfen enorm wenn was nicht so läuft wie man es erwartet.

Fehlerbehandlung ist wirklich eine sehr wichtige Sache. Und Exceptions ignorieren gehört nicht dazu.
 
Zurück