Methoden Daten aus einer SQL-Abfrage in eine mehrdimensionales Array einlesen

mrtyu

Mitglied
Hallo zusammen,

ich bin neu hier 🙂 Und habe die folgende Frage: Ich versuche Daten aus einer Oracle-Datenbank per SQL auszulesen und sie in einem kleinen Java-Programm zu verarbeiten (einmal einfach nur in tabellarischer Form und einmal in Form einer Grafik darzustellen).

Die Abfrage klappt problemlos, die Daten werden auch wunderbar ausgelesen, nur weiß ich leider nicht, wie ich sie in mein data-Objekt für die Tabelle reinbekomme 😳


Mein Ansatz bis jetzt:

Java:
 	  // Datenbankabfrage:
 	  Connection conn = Verbindung.getConnection();
 	  if (conn != null) {
 	     try {
 	        Statement stmt = conn.createStatement();
String query = "SELECT ... FROM ... WHERE ..." // hier klappt es noch prima

 	        System.out.println(query);
 	        ResultSet erg = stmt.executeQuery(query);


 	        
 	        // Aufbau der Tabelle aus der vorhergehenden Abfrage

 	       while (erg.next()) {
 	        	System.out.println(erg.getString("a") + " " + erg.getString("b") + " " + erg.getString("c") + " " + erg.getString("d"));

 	        	System.out.println(erg.getString("a"));
 	        	
 	        	String[][] data = new String [][]{{erg.getString("a")}, {erg.getString("b"), erg.getString("c")}}; // hier ist vermutlich der Fehler...
 	        	
 	       }
      
  		   JTable table = new JTable( data, title );
		   rahmen.add( new JScrollPane(table) );
		   rahmen.pack();
		   rahmen.setVisible( true );
 	        
 	        
 	        stmt.close();
 	     }
 	     catch (SQLException sqle) { System.out.println(sqle.toString()); }
 	  }
 	  else JOptionPane.showMessageDialog(null,"Keine Verbindung mit der Datenbank moeglich!");
 	  
     }
   };


Ein weiteres Problem besteht darin, dass in der Zeile "JTable table = new JTable( data, title );" Eclipse meldet: "Data cannot be resolved to a variable", obwohl die Variable in der gleichen Methode liegt.

Für den einen oder anderen Hinweis wäre ich sehr dankbar 🙂


Viele Grüße und ein schönes Wochenende Euch allen!

mrtyu
 
Hallo und herzlich Willkommen im java-forum mrtyu,

für mich ist deine Problematik noch nicht ganz klar. Was genau hast du mit
Java:
String[][] data = new String [][]{{erg.getString("a")}, {erg.getString("b"), erg.getString("c")}};
vor und wie sieht dein title Variable aus?

Ist dir denn klar, das du jedes mal mit String[][] data = new String [][]{...} deine alte Variable überschreibst?
 
Hallo z-mon,

vielen Dank für die Antwort!

Was genau hast du mit
Java:
String[][] data = new String [][]{{erg.getString("a")}, {erg.getString("b"), erg.getString("c")}};
vor und wie sieht dein title Variable aus?

Ist dir denn klar, das du jedes mal mit String[][] data = new String [][]{...} deine alte Variable überschreibst?


Stimmt, ich war gestern Abend wohl etwas verwirrt 🙂
Ich frage jetzt etwas konrekter: Ich bin zwischenzeitlich auf diesen FAQ-Thread gestoßen. Was ich haben will, ist die simpelste Variante 1 (2d-Array) - und wenn ich das Array, wie in dem Beispiel gezeigt, per Hand im Code eintrage, klappt das auch prima. Mein Problem besteht nur darin, dass ich nicht weiß, wie ich die entsprechende Schleife fomuliere, die die Daten aus der SQL-Abfrage ausliest. Könntest Du mir einen Ansatz dazu geben?


Vielen Dank und viele Grüße!

mrtyu
 
Also wenn ich das jetzt richtig verstanden habe weißt du nicht wie du dein 2-dimensionales Array füllst?

Du musst bei der Initialisierung des Arrays die Größe des Reslts mitgeben und anschließend halt an den entsprechenden Stellen das Array füllen.

Wie zum Beispiel
Java:
myArray[i][0] = "Hallo";
myArray[i][1] = "Welt";

Wobei i dein Durchlaufzähler ist.
 
das mit dem Array würde ich gleich vergessen. Schreibe Dir eine Datenklasse, deren Objekte Du dann in Deine JTable anzeigst. Die Datenobjekte befüllst Du aus dem ResultSet und fügst sie zu einer Liste an.
 
Vielen Dank für die Antworten!

Im Prinzip handelt es sich bei meiner Aufgabe um eine ganz rudimentäre Applikation, die lediglich die Inhalte aus der Datenbank herausholt und sie einmal statisch in die Tabelle schreibt - weiter nichts.

Insofern dachte ich eben an die einfache Möglichkeit... Aber ich habe nun tatsächlich Probleme damit, das zweidimensionale Array zu füllen. Bin eben noch Anfänger in Sachen Java :autsch:


Folgender Code bereitet mir nun Schwierigkeiten:

Java:
 	        int anzahlDerZeilen = 0;
 	        if (ergCount.next()){
 	        	anzahlDerZeilen = ergCount.getInt(1);
 	    	  }
 	        ergCount.close();
 	        
 	        System.out.println(anzahlDerZeilen);

 	        
 	        // Aufbau der Tabelle aus der vorhergehenden Abfrage

 	        String[][] data = new String[anzahlDerZeilen][4];
 	        
 	        
 	       String[] title = new String[]{ "A", "B", "C", "D" };
 	       
 	       while (erg.next()) {
 	        	System.out.println(erg.getString("a") + " " + erg.getString("b") + " " + erg.getString("c") + " " + erg.getString("d"));


// Array fuellen:
 	           for (int i=0; i<data.length; ++i) {
 	        	   System.out.println("i: "+i);
 	              for (int j=0; j<data[i].length; ++j) {
 	            	 System.out.println("j: "+j);
 	                data[i][0] = erg.getString("a");
 	                data[i][1] = erg.getString("b");
 	                data[i][2] = erg.getString("c");	                
 	                data[i][3] = erg.getString("d");
 	              }
 	           }
 	           
 	       }

Es läuft im Grunde schon fast richtig, nur werden leider alle Werte in der Tabelle vom letzten Wert überschrieben... Könnte mir jemand einen Hinweis auf meinen Denkfehler geben? ???:L


Danke und viele Grüße

mrtyu
 
Hallo mrtyu,

scheint du hast dich in den geschachtelen Schleifen verfahren.

in Zeile 17 gehst du deine Abfrage-Results durch

innerhalb dieser Schleife läufst du in Zeile 22 jeweils dein komplettes Array ab und trägst somit jeweils den aktuellen Satz aus der while Schleife in dein Array ein. Somit kann das Array immer nur die Daten des letzten while enthalten.

die for Schleife in Zeile 24 kannste dir eigentlich sparen, da du innerhalb dieser Schleife die Zellen eh hart codierst (data[0] -> data[3] einträgst. Solls abhängig der Zellenanzahl innerhalb der Schleife passieren wäre eher data[j] angebracht.

Vielleicht hifts ja deinen Gedankenknoten zu lösen
mfg
gafktor
 

Zurück
Oben