# Daten einer DatenbankTabelle in JTable darstellen



## XoxoL (18. Dez 2009)

Guten Tag allerseits, 
ich habe ein Problem bei der Darstellung einiger Daten einer Datenbanktabelle in einer JTable
Ich habe schon viel nachgelesen aber ich verstehe immer noch eine ganze Menge nicht.
z.B. weiß ich, dass ich ein TableModel hier für benötige hab auch ein paar Beispiele gefunden 


```
TableModel model = new AbstractTableModel() {
    String[][] data = new String[] { {"A1","A2"},
                                   {"B1","B2"}});
    public int getRowCount() { return data.length; }
    public int getColumnCount () { return 2; }
    public Object getValueAt (int row, int column) {
      return data[row][column];
    }
  }
```

da ich meine Daten aus einer Datenbanktabelle darstellen will bräuchte ich so etwas wie:
:noe:

```
dbconnection con = new dbconnection();
             dbFunktion fkt = new dbFunktion();
		
	String qrKunden = "SELECT KDNR, KName, KFirma FROM Kunden";
		
	String [][][] KundenData = new String[fkt.getID()-1][fkt.getID()-1][fkt.getID()-1];
	String [] columnNames = {"KdNr", "Name", "Firma"};
	int nr=0, name=0, firm=0;
		
	con.connect();
	con.executeQuery(qrKunden);
```
genaues Problem ich weiß nicht wie ich das Aray mit Daten aus der Datenbank füllen soll ;(

ich bin für jede Antwort dankbar.


----------



## XoxoL (20. Dez 2009)

Für die jenigen die das selbe Problem haben könnte es interessant sein.
Ich die Vorgehensweise geändert, ich arbeite mit Vectoren und es scheint zu klappen bis auf ein paar Kleinigkeiten.

mit Hilfe dieser funktion hole ich die Daten aus der Datenbanktabelle und füge diese einem Vector hinzu zwar klappt es vorerst nur für einen Datensatz aber ich arbeite daran es zu verfolständigen

```
public Vector KundenModel() throws Exception{
	    Vector data = new Vector();
	    Vector  rowA  = new Vector();
	    	
	    con.connect();
                 con.executeQuery(qrKundenModel);
	    while (con.rs.next()) {
	         for (int i = 1; i <= con.clmCnt; i++) {
	         rowA.add(con.rs.getString(i));   
                     }
		        
                }
                data.add(rowA);
                con.dbdisconnect();
	
                return data;
   }
```
den Vector übergebe ich an die JTable und es klappt

```
JTable table = new JTable( fkt.KundenModel(), titels );
```
wenn mir jemand noch auf die Spünge helfen kann wie ich alle Datensätze dem Vector data hinzufügen kann were ich sehr verbunden.


----------



## Michael... (20. Dez 2009)

zwischen Zeile 7 und 8 muss noch 
	
	
	
	





```
rowA  = new Vector();
```
 rein.
Du brauchst für jede Zeile ein neues Vector Objekt


----------



## XoxoL (20. Dez 2009)

Danke deine Antwort hat mir sehr geholfen:toll:

und hier die komplette Funktion für die jenigen die auf das gleiche Problem stoßen sollten


```
public Vector KundenModel() throws Exception{
	    	Vector data = new Vector();
	    	Vector  rowA  = new Vector();
	    	
	    	con.connect();
		    con.executeQuery(qrKundenModel);
		    while (con.rs.next()) {
		    	rowA = new Vector();
		        for (int i = 1; i <= con.clmCnt; i++) {
		           rowA.add(con.rs.getString(i));   
		         }
		        data.add(rowA);
		    }	  
		    con.dbdisconnect();
	
	    	return data;
	    }
```

:smoke:


----------



## nickname (20. Dez 2009)

Hi XoxoL,

ich habe so etas ähnliches vor aber zuerst mit einer ComboBox. Hast du in der Hinsicht schon
Erfahrungen gemacht. Habe bis jetzt noch nicht mit der Klasse Vector gearbeitet. Kann ich diese 
dafür einsetzten?

Und würde gerne wissen, ob deine Methode
	
	
	
	





```
con.connect();
```
in Zeile fünf ein einfacher Verbindungsaufbau ist.

danke,
nickname


----------



## XoxoL (20. Dez 2009)

Hi, 
mit der Combobox noch nicht aber das steht mir noch bevor, wenn ich etwas herrausgefunden habe werde ich es hier posten

hier die connect() Funktion


```
public void connect() throws Exception {
        Class.forName(DBdriver);
        con = DriverManager.getConnection(DBurl);
    }
```


----------



## nickname (20. Dez 2009)

Hi, bin gerade dabei aber hab noch ein paar Prob. Wäre nett, wenn du ein paar Ansätze mal bei
Gelegenheit vorstellen würdest.

Vielleicht kannst Du mir noch eine Frage beantworten, weil ich da noch ein Verständnisprob. habe.

[DUKE]Rufst du deine connect() immer auf, wenn Du Datan aus der DB abfragst? Ich dacht, es würde
reichen dies nur einmal zu tun und dann, wenn das Programm endet, diese zu schliessen?[/DUKE]

Deshalb denke ich auch, dass ich die Element nicht in der ComboBox speichern könnte.
Aber warum eigentlich nicht, denn wenn ich z.B. in einer JTextField anzeigen kann, warum dann auch nicht in einer ComboBox..:bahnhof:

Bin gerade dabei mir die Vector-Klasse anzuschauen:rtfm:

danke,

nickname


----------



## XoxoL (21. Dez 2009)

du hast Recht es reicht einmal die Verbindung aufzubauen und einmal zu trenen, mit meinem Programm werden aber zwei Nutzer arbeiten die vieleicht parallel arbieten werden


----------



## nickname (21. Dez 2009)

HI,



			
				Xoxol hat gesagt.:
			
		

> ...es reicht einmal die Verbindung aufzubauen und einmal zu trenen...


meinst Du damit eine permanente Verbindung? Das bekomme ich einfach nicht hin. Wenn ich
Daten aufrufen möchte, muss ich auch in dieser Methode halte den Treiber und die Verbindung ansich
aufrufen. Wenn nicht, bekomme ich beim Aufrufen meiner Daten eine "NullPointerException" auf meine
"stat = connection.createStatemanet();"  .;(

Bekommst du das nicht????:L

danke,

nickname


----------



## XoxoL (21. Dez 2009)

es wäre einfacher, wenn deinen code posten würdest


----------



## nickname (21. Dez 2009)

Hi Xoxol,

hab mir was anderes überlegt. Was hältst du davon? Hab es mal über Connection Pool versucht

```
public DataSource getConnectionPoolDataSource(String server, String port,
													String database, String user, String password)
	{
		MysqlConnectionPoolDataSource source;
		
			try{
				source = new MysqlConnectionPoolDataSource();
				source.setServerName(server);
				source.setPort(Integer.parseInt(port));
				source.setDatabaseName(database);
				source.setUser(user);
				source.setPassword(password);
			}
			
			catch(Exception e)
			{
				e.printStackTrace();
				source = null;
			}
		return source;
	}
	
	
	
			public void abfrageDatenbank()
			{
				try{
					ds = this.getConnectionPoolDataSource("localhost" ,"3306", "adressen", "rXXXtX", "mXXXXXXX2");
				
				String str = "SELECT * FROM adresse";
				con = ds.getConnection();
				stat = con.createStatement();
				rs = stat.executeQuery(str);
				
					while(rs.next())
					{
						name = rs.getString("name");
						vorname = rs.getString("vorname");						
						System.out.println(name + " " + vorname);
					}
					stat.close();
                                       con.close();
					}
				
				catch(Exception e)
					{
						e.printStackTrace();
					}
			}
```
Mir ist nur nicht klar ob die Verbindung zur DB jetzt virtuell oder physikalisch geschlossen ist.
Ich kenne mich noch garnicht mit ConnectionPool aus. Ist das überhaupt sinnvoll das zu benutzen?
Und was bedeutet das überhaupt, dass die Verbindung virtuell oder physikalisch geschlossen ist?

Wie immer mehr Fragen als Antworten...:rtfm:

danke,

nickname


----------



## XoxoL (22. Dez 2009)

Ich bin auch ein Anfänger und programmiere soweit meine Kenntnisse reichen und wenn ich auf ein Problem stosse suche ich nach :rtfm: Lösungen "learning by doing". Ich habe mehrere Methoden ausprobiert und eine ausgewählt die sofort und einfach funktioniert hat. Mit connectionPool habe ich noch keine Erfahrungen. Mal ne andere Frage mit welcher Datenbank arbeitest du oder hast vor zu arbeiten?


----------



## nickname (22. Dez 2009)

Hi,



			
				XoxoL hat gesagt.:
			
		

> mit welcher Datenbank arbeitest du


arbeite mit MySQL und dem MySQL Query-Browser. Bin auch noch nicht lange damit zu gange.
Und was ist mit Dir? Mit welcher arbeitest du denn?




			
				XoxoL hat gesagt.:
			
		

> wenn ich auf ein Problem stosse suche ich nach  Lösungen "learning by doing".


so versuche ich es auch immer.:rtfm:



			
				XoxoL hat gesagt.:
			
		

> Mit connectionPool habe ich noch keine Erfahrungen.


Habe ich auch nicht. Das war auch mein erster Versuch. Ich weiß nur, dass man
die Verbindung nicht wirklich (also physikalisch) sondern nur virtuell mit close()
trennt und das der "neue" Verbindungsaufbau halt keinen kompletten neuen Aufbau
benötigt. Mehr weiß ich aber auch nicht. Es gbit wenig darüber zu lesen.

Mich würde es aber echt interessieren, wie du das mit deiner ComboBox gelößt hast,
denn irgendwie bekomme ich das nicht hin.

gruß
nickname


----------



## XoxoL (22. Dez 2009)

ich habe bis jetzt mit Access gearbeitet aber immer wieder auf Probleme gestossen überlege mir gerade auf JavaDB umzusteigen. Habe ein paar Tests damit gemacht, bei netbeans kann man die Daten einer JavaDBTabelle in JTable oder ComboBox einfach einbinden ohne viel code zu schreiben. Weiss aber noch nicht wie ich die Daten aus Access in JavaDB importieren kann.


----------

