# DatabaseMetaData.getTables einzelne Tabelle



## mephi (4. Sep 2007)

Die Methode getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types)
wird ja meistens so aufgerufen: 


```
String[] types = {"TABLE"};
ResultSet rsTables = m_dbmd.getTables(null, null, "%", types);
```

zumindest in den tutorials die ich gefunden habe.. ich möchte jetzt aber um die db nicht zu belasten bzw um möglichst wenig rechenzeit zu haben nur nach einem table suchen
habe es dann so versucht:


```
String[] types = {"TABLE"};
ResultSet rsTables = m_dbmd.getTables(null, null, "PROFESSOR", types);
```

aber das funktioniert nicht. bekomme bei 


```
String tableName = rsTables.getString(3);
```

dann folgende fehlermeldung


```
java.sql.SQLException: No data is available
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.jdbcResultSet.checkAvailable(Unknown Source)
	at org.hsqldb.jdbc.jdbcResultSet.getColumnInType(Unknown Source)
	at org.hsqldb.jdbc.jdbcResultSet.getString(Unknown Source)
	at org.mypackage.CRUDManager.generate(CRUDManager.java:116)
```

wie komm ich den über die DatabaseMetaData an eine einzelne table heran?


----------



## SlaterB (4. Sep 2007)

immer langsam, funktioniert es denn mit dem %?

wenn ja, dann P%? p%?
und so langsam an deinen gewünschten Tabellennamen herantasten, um Tippfehler auszuschließen


----------



## mephi (4. Sep 2007)

arg muss jetzt leider heim. werds morgen testen und mich wieder melden

danke schonmal


----------



## mephi (5. Sep 2007)

Also mit % funktionierts am Anfang

es mit p% zu testen wird schwer. je nachdem welche table ich brauche schaut mein prog in einer map nach ob dieses schonmal verwendet wurde. wenn nicht wird die abfrage statt.


```
String[] types = {"TABLE"};
ResultSet rsTables = m_dbmd.getTables(null, null, normalizedTableName, types);
```

normalizedTableName war in dem einen Fall jetzt "PROFESSOR"
kleingeschrieben tuts auch nicht...

edit:

```
private CRUDGenerator generateCRUDObject(String tablename) throws CRUDException{
		String normalizedTableName = tablename.trim().toUpperCase();
		CRUDGenerator CRUDObject = null;
		if(m_availableTables.containsKey(normalizedTableName)){
			Table table = (Table) m_availableTables.get(normalizedTableName);
            CRUDObject = new CRUDGenerator(table);
			return CRUDObject;
		}
		else{
			try {
				String[] types = {"TABLE"};
				ResultSet rsTables = m_dbmd.getTables(null, null, "%", types);
				System.out.println();
				String tableName = rsTables.getString(3);
```


es tut nichtmal so...


----------



## SlaterB (5. Sep 2007)

> schaut mein prog in einer map nach [..]

das kann ja nix werden,
du musst genau einen Befehl absetzen, in einem Testprogramm, welches 20 Zeilen lang ist,
geht das odert nicht?

wenn in deinem hochkomplexen Wirrwarr irgendwas nicht geht, 
dann ist das erstmal irrelevant


----------



## mephi (5. Sep 2007)

SlaterB hat gesagt.:
			
		

> > schaut mein prog in einer map nach [..]
> 
> das kann ja nix werden,
> du musst genau einen Befehl absetzen, in einem Testprogramm, welches 20 Zeilen lang ist,
> ...



an dem befehl an sich liegts wohl nicht. am anfang gehts ja... muss also wo anders liegen
hmmmm

de code ist fast nur copy und paste zu dem wenn beim ersten mal alle daten erstellt werden...




```
private Hashtable createTableNamesList(Connection connection) throws SQLException
    {
		Hashtable hashtable = new Hashtable();
		String[] types = {"TABLE"};
        
		ResultSet rsTables = m_dbmd.getTables(null, null, "%", types);
		//Get the table names
        while (rsTables.next()) {
            // Get the table name
            String tableName = rsTables.getString(3);
            System.out.println(tableName);
            Table table = new Table(tableName);
            ResultSet rsPrimaryKeys = m_dbmd.getPrimaryKeys(null, null, tableName);
            ArrayList primaryKeys = new ArrayList();
            while (rsPrimaryKeys.next()){
            	String tableFieldName = rsPrimaryKeys.getString(4);
            	primaryKeys.add(tableFieldName);
            }
            ResultSet rsFields = m_dbmd.getColumns(null, null, tableName, "%");
            while (rsFields.next()) {
	            // Get the table fields
	            String tableFieldName = rsFields.getString(4);
	            TableField tablefield = new TableField(tableFieldName);
	            if(primaryKeys.contains(tableFieldName)){
	            	tablefield.setPrimaryKey(true);
	            }
	            table.addTableField(tablefield);
	        }
            hashtable.put(table.getTablename(),table);
            // Get the table's catalog and schema names (if any)
            //String tableCatalog = rs.getString(1);
            //String tableSchema = rs.getString(2);
            rsFields.close();
        }
        rsTables.close();
	}
```

die funktioniert. von der habe ich "geklaut"


----------



## mephi (5. Sep 2007)

ooooh man, ich hab den fehler

ein einfaches rsTables.next() hat gefehlt

n typischer copy & paste fehler.


----------

