Daten aus MYSQL Datenbank in Array Speichern

daniel_sun

Erfahrenes Mitglied
Hallo,

vorweg muss ich sagen das die Abfrage funkioniert und wenn ich die Werte in normale varialben speichere ist das auch kein Problem. Nun möchte ich meine Tabelle in ein 2D-Array speichern leider werden alle Arrayfelder auf null gesetzt und ich finde meinen Fehler nicht.

Code:
		DBHandler db = new DBHandler();
		ResultSet result = db.QuerySelect("SELECT * FROM movies");
		
		String[] columNames = {"Film ID", "Titel", "Größe", "Speicherort"};
		Object[][] data = new Object[2][4];
		DefaultTableModel tableModel = null;
		
		try {
			while(result.next()){
				for(int i=0; i<0; i++){
					data[i][1] = result.getInt(1);
					data[i][2] = result.getString(2);
					data[i][3] = result.getInt(3);
					data[i][4] = result.getString(4);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

Gruß

Daniel_sun
 
Java:
for(int i=0; i<0; i++)
ist der Fehler.
Les es dir selber mal vor. Starte bei i=0, tue xx solange wie i<0 (Startwert 0 < 0 ******!) und erhöhe i immer um 1.

Fehler entdeckt? :p
0 ist halt nie kleiner als 0 und deswegen macht er die for schleife nie xD
Mach einfach:
Java:
for(int i=0; i<1;i++)
// oder
for(int i=0; i<=0;i++)

auch wenn mir der sinn der for schleife eh verborgen bleibt (da du sie "anscheinend" ja eh nur einmal durchlaufen willst) x_x

edit: mir ist noch aufgefallen, du startes ja bei data[i][1] und gehst bis [i][4], Länge 4 hat aber nur {0,1,2,3} als gültigen Index, sonst gibts ne OutOfBounds ^^ also bei [i][0] starten und bis [i][3] gehen.
 
Zuletzt bearbeitet:
Er will scheinbar alle Datensätze ins Array laden und damit nicht immer der erste "Datensatz" überschrieben wird, braucht man eben noch einen Counter, der aber eben nicht ganz richtig umgesetzt worden ist, daher auch das komische Schleifenkonstrukt. Das müsste eigentlich so aussehen:
Java:
for(int i = 0; result.next(); i++) {
	data[i][0] = result.getInt(1);
	data[i][1] = result.getString(2);
	data[i][2] = result.getInt(3);
	data[i][3] = result.getString(4);
}
Die Indezes hab ich dann auch gleich mal mit gefixt.
 
Ich hab mein Programm nun erweitert was auch alles schön geklappt hat. Nun will ich die DB etwas Rationaisieren. Anstatt den wert in Spalte 4 Direkt hinein zu scheiben, möchte ich ihn in eine Tabelle auslagern und per id zu greifen. Das Programm soll natürlich anstatt der ID den Namen ausgeben.

Code:
public void updateContent(String whereCon){
		DBHandler db = new DBHandler();
		ResultSet result = db.QuerySelect("SELECT * FROM movies " + whereCon);
		
		
		Object[][] data = new Object[2][5];
		
		try {
				for(int i=0; result.next(); i++){
					data[i][0] = result.getInt(1);
					data[i][1] = result.getString(2);
					double help = Math.round((result.getDouble(3)/1024/1024/1024)*100);
					data[i][2] = help/100;
					ResultSet result2 = db.QuerySelect("SELECT * FROM quality WHERE qualityID =" + result.getInt(4));
					data[i][3] = result2.getString(2);
					data[i][4] = result.getString(5);
					
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		tableModel.setDataVector(data, columNames);
		this.repaint();
		this.revalidate();
		db.close();

	}

getInt(4) liefert die richtige ID zurück und wenn man den Query mit der ID direkt in mysql eingibt wird der richtige Datensatz zurück gegeben. Leider bricht mein Programm an der Stelle ab:
Code:
 data[i][3] = result2.getString(2);

Ich habe keine Ahnung was sein problem ist und bitte daher nochmal um Hilfe. Natürlich steht an stelle 2 auch der passende String ;)

GRuß

daniel_sun
 
Der StackTrace wäre nicht schlecht für sowas, wird sonst schwierig den Fehler zu finden.

In diesem Fall ist der Fehler einfach, dass von result2 die next() Methode nicht mal ein mal aufgerufen wird, daher springt der Zeiger auch nicht zum ersten Datensatz.

Schöner wäre aber das gleich in der ersten Abfrage zu machen, z. B. durch ein Join. Dann hat man den Zirkus auch gar nicht erst und die zusammengehörigen Daten werden gleich zusammen geliefert.
 
Ah ja Join, Da war doch was :) So klappts natürlich einwand frei.

Nur fürs Verständnis es ist aber keinproblem mit einm und dem selben conncetor-objekt verschiedene Querys auszuführen oder?
 
Nein, es ist kein Problem mehrere Queries über eine Connection zu jagen. Über das Folgende bin ich mir nicht ganz sicher, vielleicht kann dazu jemand anderes was genaueres sagen. Man sollte nach Möglichkeit nur nicht das selbe Statement für verschiedene Queries verwenden. An sich ist das möglich und ich selbst habe damit auch noch nie Probleme gehabt, aber es könnte sein, dass wenn die Verarbeitung für ein Query noch am Laufen ist und man direkt ein zweites Query oder noch mehr abfeuert, dass das eventuell zu Problemen führen kann. Man kann eine Statement-Instanz dennoch für mehrere Queries verwenden, nur muss man dann sicherstellen, dass es nicht noch in verwendung ist durch ein vorheriges Query. Wie gesagt, ich bin mir da nicht so ganz sicher, vielleicht weiß da jemand anderer mehr.

Und wie gesagt, warum das bei dir nicht geklappt hat war der fehlende Aufruf von result2.next(), denn erst dadurch wird der Datensatzzeiger entsprechend verschoben, beim ersten Mal eben zum ersten Datensatz.
 

Neue Beiträge

Zurück