# Tabellen nacheinander auslesen



## Einklang. (26. Jun 2012)

Ihc möchte mehrere Tabellen nacheinander auslesen und bekomm eine komische Fehlermeldung:


```
Statement s = dbconnection.createStatement();
        
        s.executeQuery ("Show tables");
        ResultSet resulttable = s.getResultSet ( );
        
        while (resulttable.next())
         {
        	 System.out.println(resulttable.getString(1));
        	 ResultSetMetaData mdtable = resulttable.getMetaData ( );
        	 ResultSet tabellenabfrage = s.executeQuery("Select * from " + resulttable.getString(1)); 
        	 System.out.println("Das ist der Inhalt der Tabelle " + resulttable.getString(1) + ": " + tabellenabfrage.getString(1));
        	 
         }
```

Das ist die Fehlermeldung:


```
datenbanktabelle
SQL-Exception bei der Abfrage: Operation not allowed after ResultSet closed
```


----------



## SlaterB (26. Jun 2012)

du brauchst mindestens zwei verschiedene Statements von der Connection, 
das von der äußeren Query darf nicht durch eine neue innere Query 'kaputt gemacht' werden, sonst wird dessen ResultSet geschlossen,
die inneren Querys in einem zweiten Statement oder ganz einfach bei jeder Query ein neues Statement

alternativ die Ergebnisse der ersten Query vor der Schleife (mit einer anderen Schleife) alle extrahieren,
dann wird das ResultSet nicht mehr gebraucht


edit:
für ResultSet tabellenabfrage musst du auch erst next() aufrufen, bevor du irgendwas abfragen kannst


----------



## Einklang. (26. Jun 2012)

Ah ok ich bin einfach bissl zu ungeduldig mit meinen Sachen und muss mic hda mehr drauf konzentrieren....!

So vor paar Wochen angefangen und jetzt klappen schon kleine Sachen und damit andere auch Datenbanken auslesen können hier der funktionierende Code, der dann je nach Datenbankstruktur noch weiter so ausgebaut werden kann....!


```
Statement s = dbconnection.createStatement();
        
        s.executeQuery ("Show tables");
        ResultSet resulttable = s.getResultSet ( );
        
        while (resulttable.next())
         {
        	 System.out.println(resulttable.getString(1));
        	 ResultSetMetaData mdtable = resulttable.getMetaData ( );
        	 Statement stat = dbconnection.createStatement();
        	 stat.executeQuery("Select * from " + resulttable.getString(1));
        	 ResultSet tabellenabfrage = stat.getResultSet();
        			 
        	 while (tabellenabfrage.next())
        	 {
        		 System.out.println(tabellenabfrage.getString(1));
        		 
        	 }
        	 
        	 
         }
```


----------



## SlaterB (26. Jun 2012)

tja, die Frage ist schon eine ganz andere als die ähnliche
http://www.java-forum.org/datenbankprogrammierung/136510-anzeige-datenbankabfrage-textfeld-o-ae.html
mit dann entsprechend anderen Antwortenverlauf,
falls dieser Hinweis nicht zu selbstgefällig ist


----------



## Einklang. (26. Jun 2012)

Ja da bleibe ich auch dabei dass das völlig korrekt war.........! ;-)


----------



## Einklang. (26. Jun 2012)

Ich hab das noch etwas ausgebaut und jetzt ein PRoblem:


```
Statement s = dbconnection.createStatement();
        
        s.executeQuery ("Show tables");
        ResultSet resulttable = s.getResultSet ( );
        
        while (resulttable.next())
         {
        	 System.out.println("Tabelle in Datenbank gefunden: " + resulttable.getString(1));
        	 ResultSetMetaData mdtable = resulttable.getMetaData ( );
        	 Statement stat = dbconnection.createStatement();
        	 stat.executeQuery("Select * from " + resulttable.getString(1));
        	 ResultSet tabellenabfrage = stat.getResultSet();
        	 ResultSetMetaData tabellemeta = tabellenabfrage.getMetaData ( );
        	 int spaltenzahl = tabellemeta.getColumnCount();
        	 System.out.println("Spaltenanzahl der Tabelle: " + spaltenzahl);
        	 
        	 while (tabellenabfrage.next())
        	 {
        		 int i = 1;
        		 for (i = 1; i < spaltenzahl; i++)
        		 {
        		 System.out.println("Spaltenname: " + tabellemeta.getColumnLabel(i));
        		 System.out.println("Type der Spalte " + tabellemeta.getColumnType(i));
        		 }
        	 }
        	 
        	 
         }
```

Für die letzte Zeile erhalte ich für den Type eine Zahl und die Frage ist wie ich nun die Zahl in einen String umwandle, denn schließlich soll ja angezeigt werden, ob die Spalte nun int, String usw usf ist....!


----------



## SlaterB (26. Jun 2012)

Types (Java Platform SE 7 )
enthält die Types als statische Konstanten zum Vergleich,

getColumnTypeName() sieht auch vielversprechend aus
ResultSetMetaData (Java Platform SE 7 )


----------



## Einklang. (27. Jun 2012)

1. Ich benutze hier schon ein ResultSetMetaData mit "tabellemeta", hole dort eben die Spalte heraus aber eben als int und ich bräuchte das als String - eine klare Bezeichnung eben...! 


2. Aber mir fiel noch was auf an dem Code, ein anderes PRoblem:


```
int i = 1; 
        Statement s = dbconnection.createStatement();
        
        s.executeQuery ("Show tables");
        ResultSet resulttable = s.getResultSet ( );
   	 	
        while (resulttable.next())
         {
        	 System.out.println("Tabelle in Datenbank gefunden: " + resulttable.getString(1));
        	 ResultSetMetaData mdtable = resulttable.getMetaData ( );
        	 // String tabellenname = mdtable.getColumnName(1);
        	 // System.out.println(tabellenname);
        	 Statement stat = dbconnection.createStatement();
        	 stat.executeQuery("Select * from " + resulttable.getString(1));
        	 ResultSet tabellenabfrage = stat.getResultSet();
        	 ResultSetMetaData tabellemeta = tabellenabfrage.getMetaData ( );
        	 int spaltenzahl = tabellemeta.getColumnCount();
        	 System.out.println("Spaltenanzahl der Tabelle: " + spaltenzahl);
        	 
        	 while (tabellenabfrage.next())
        	 {
        		 
        		 for (i = 1; i <= spaltenzahl; i++)
        		 {
        		 System.out.println("Spaltenname: " + tabellemeta.getColumnLabel(i));
        		 //System.out.println("Type der Spalte " + tabellemeta.getColumnType(i));
        		 }
        	 }
        	 
        	 
         }
```

Hier werden im Ergebnis dann alle Einträge durchgelaufen (rows) und immer wieder die Spalten abgelesen (columns) - das soll natürlich nur einmal pro Tabelle geschehen! Ist ja Unsinn sonst...!
Zwei Möglichkeiten seh ich: einmal in der SQL-Abfrage direkt und der wohl einfachere Weg (der aber mehr Verarbeitung von Daten beinhaltet) so wie es steht nur statt "tabellenabfrage.next()" nur irrgendwie einen Datensatz auslesen......!

So jetzt die Frage welcher Befehl da hilft um nur einen Datensatz zu nehmen und an dem die Metainfos zu spalten auszulesen....?


----------



## SlaterB (27. Jun 2012)

1. ich habe dir genannt wie du den int interpretieren kannst, was freilich eine größere Arbeit mit vielen ifs oder switch wäre,
sowie eine alternative Methode, die gleich den Namen zurückgibt(!), 
mehr gibt es wohl wirklich nicht 

2.
man kann Querys beschränken, LIMIT 1 vielleicht bei MySql, je nach DB anders, nicht zwingend vorhanden,
oder eine Query mit [c]WHERE id = min(select alle Ids der Tabelle)[/c]

oder mit dem großen Resultset leben und auf die while-Schleife verzichten, ein einfaches if tu es auch, bzw. nur next() 
bzw. du brauchst next() gar nicht, kannst gleich mit Metadata loslegen


----------



## Birne140787 (27. Jun 2012)

Und hast erkannt, auf welche Schleife sich die rows beziehen und auf welche die columns?


----------



## Einklang. (27. Jun 2012)

Ok super so funktionierts:


```
int i = 1; 
        Statement s = dbconnection.createStatement();
        
        s.executeQuery ("Show tables");
        ResultSet resulttable = s.getResultSet ( );
   	 	
        while (resulttable.next())
         {
        	 System.out.println("Tabelle in Datenbank gefunden: " + resulttable.getString(1));
        	 ResultSetMetaData mdtable = resulttable.getMetaData ( );
        	 // String tabellenname = mdtable.getColumnName(1);
        	 // System.out.println(tabellenname);
        	 Statement stat = dbconnection.createStatement();
        	 stat.executeQuery("Select * from " + resulttable.getString(1));
        	 ResultSet tabellenabfrage = stat.getResultSet();
        	 ResultSetMetaData tabellemeta = tabellenabfrage.getMetaData ( );
        	 int spaltenzahl = tabellemeta.getColumnCount();
        	 System.out.println("Spaltenanzahl der Tabelle: " + spaltenzahl);
        	 
        	 if (tabellenabfrage.next())
        	 {
        		 
        		 for (i = 1; i <= spaltenzahl; i++)
        		 {
        			 System.out.println("Type der Daten aus der Spalte " + tabellemeta.getColumnLabel(i) + ": " + tabellemeta.getColumnTypeName(i));
        		 
        		 }
        	 }
        	 
         }
```


----------

