DatabaseMetaData.getTables einzelne Tabelle

Status
Nicht offen für weitere Antworten.

mephi

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

Code:
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:

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

aber das funktioniert nicht. bekomme bei

Code:
String tableName = rsTables.getString(3);

dann folgende fehlermeldung

Code:
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?
 
S

SlaterB

Gast
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

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

danke schonmal :)
 

mephi

Bekanntes Mitglied
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.

Code:
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:
Code:
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...
 
S

SlaterB

Gast
> 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

Bekanntes Mitglied
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,
geht das odert nicht?

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

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...



Code:
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

Bekanntes Mitglied
ooooh man, ich hab den fehler

ein einfaches rsTables.next() hat gefehlt

n typischer copy & paste fehler.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben