# Unbekannte Datenbank über Metadaten auslesen?



## NiBurhe (11. Jan 2008)

Hallo,

wir sollen für die BA ein Java Programm schreiben, was aus einer unbekannten Datenbank möglichst viele Informationen aus den Metadaten holt. Leider weiss ich nicht wirklich, wie ich da an brauchbare Daten rankommt, weil das eine Fülle an Daten sind, die mir aber alle nicht wirklich was sagen.

Wie komme ich z.B. an Tabellennamen in der DB?
Wie komme ich an die Spaltennamen in den jeweiligen Tabellen?
.
.
.

Gibt es irgendwo eine gute Übersicht für sowas?

Vielen Dank!
NiBurhe


----------



## DP (11. Jan 2008)

welches dbms? access, mysql, txt, ... ?


----------



## Guest (12. Jan 2008)

Siehe: java.sql.DatabaseMetaData


----------



## NiBurhe (12. Jan 2008)

DP hat gesagt.:
			
		

> welches dbms? access, mysql, txt, ... ?


Gibt es da einen Unterschied, dachte durch das jdbc würden die alle die gleichen Methoden haben?
H2 und MySQL hatte ich mir jetzt erstmal so vorgenommen.


			
				Gast hat gesagt.:
			
		

> Siehe: java.sql.DatabaseMetaData


Das Problem ist, dass ich nicht wirklich weiss, welche ich davon benötige, weil das ja doch einige sind.

Danke
NiBurhe[/quote]


----------



## maki (12. Jan 2008)

Also bei mir funktioniert Google: http://www.google.com.au/search?hl=en&q=DatabaseMetaData+example&btnG=Google+Search&meta=


----------



## Guest (12. Jan 2008)

Hier ein simples Beispiel

```
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class DatabaseMetaDataTest {

   private static void printResultSet(ResultSet rs) throws SQLException {
      try {
         ResultSetMetaData rsmd = rs.getMetaData();
         while(rs.next()) {
            for(int i=1, n=rsmd.getColumnCount(); i<=n; i++) {
               System.out.print(String.format("%s = %s; ", rsmd.getColumnName(i), rs.getString(i)));
            }
            System.out.println();
         }
      }
      finally {
         rs.close();
      }
   }
   
   public static void main(String[] args) throws Exception {
      Connection connection = null;
      try {
         Class.forName("org.h2.Driver");
         connection = DriverManager.getConnection("jdbc:h2:tcp://localhost/db", "user", "password");

         DatabaseMetaData dbmd = connection.getMetaData();
         printResultSet(dbmd.getCatalogs());
         System.out.println();
         printResultSet(dbmd.getSchemas());
         System.out.println();
         printResultSet(dbmd.getTables(null, null, "%", null));
         System.out.println();
         printResultSet(dbmd.getColumns(null, null, "%", "%"));
      }
      finally {
         if(connection != null) {
            connection.close();
         }
      }
   }

}
```


----------



## NiBurhe (12. Jan 2008)

Danke

aber gibt es auch eine Möglichkeit an die User Tabellen dranzukommen? Das scheinen jetzt ja nur die Systeminternen Tabellen zu sein und nicht die, die der User angelegt hat.

MfG
NiBurhe


----------



## Guest (12. Jan 2008)

NiBurhe hat gesagt.:
			
		

> aber gibt es auch eine Möglichkeit an die User Tabellen dranzukommen? Das scheinen jetzt ja nur die Systeminternen Tabellen zu sein und nicht die, die der User angelegt hat.


Die vom User angelegte Tabellen sind doch auch dabei. Schau dir doch die Beschreibung zu getTables an.
In meinem Beispiel wird so gut wie alles ausgegebe, du kannst die Auswahl aber einschränken.


----------



## NiBurhe (13. Jan 2008)

Hallo,

ich habe es jetzt soweit, dass er mir die Tabellen ausgibt, leider nur die Systemtabellen

Folgende Abfragen werden bearbeitet

```
setTable(dbmd.getCatalogs());
			System.out.println();
			setTable(dbmd.getSchemas());
			System.out.println();
			setTable(dbmd.getTables(null, null, "%", null));
			System.out.println();
			setTable(dbmd.getColumns(null, null, "%", "%"));
```

Mit dem Ergebnis:

```
Tabellen
CATALOGS
	CATALOG_NAME
COLLATIONS
	NAME
	KEY
COLUMNS
	TABLE_CATALOG
	TABLE_SCHEMA
	TABLE_NAME
	COLUMN_NAME
	ORDINAL_POSITION
	COLUMN_DEFAULT
	IS_NULLABLE
	DATA_TYPE
	CHARACTER_MAXIMUM_LENGTH
	CHARACTER_OCTET_LENGTH
	NUMERIC_PRECISION
	NUMERIC_PRECISION_RADIX
	NUMERIC_SCALE
	CHARACTER_SET_NAME
	COLLATION_NAME
	TYPE_NAME
	NULLABLE
	IS_COMPUTED
	SELECTIVITY
	CHECK_CONSTRAINT
	REMARKS
COLUMN_PRIVILEGES
	GRANTOR
	GRANTEE
	TABLE_CATALOG
	TABLE_SCHEMA
	TABLE_NAME
	COLUMN_NAME
	PRIVILEGE_TYPE
	IS_GRANTABLE
CONSTANTS
	CONSTANT_CATALOG
	CONSTANT_SCHEMA
	CONSTANT_NAME
	DATA_TYPE
	REMARKS
	SQL
	ID
CONSTRAINTS
	CONSTRAINT_CATALOG
	CONSTRAINT_SCHEMA
	CONSTRAINT_NAME
	CONSTRAINT_TYPE
	TABLE_CATALOG
	TABLE_SCHEMA
	TABLE_NAME
	CHECK_EXPRESSION
	COLUMN_LIST
	REMARKS
	SQL
	ID
CROSS_REFERENCES
	PKTABLE_CATALOG
	PKTABLE_SCHEMA
	PKTABLE_NAME
	PKCOLUMN_NAME
	FKTABLE_CATALOG
	FKTABLE_SCHEMA
	FKTABLE_NAME
	FKCOLUMN_NAME
	ORDINAL_POSITION
	UPDATE_RULE
	DELETE_RULE
	FK_NAME
	PK_NAME
	DEFERRABILITY
DOMAINS
	DOMAIN_CATALOG
	DOMAIN_SCHEMA
	DOMAIN_NAME
	COLUMN_DEFAULT
	IS_NULLABLE
	DATA_TYPE
	PRECISION
	SCALE
	TYPE_NAME
	SELECTIVITY
	CHECK_CONSTRAINT
	REMARKS
	SQL
	ID
FUNCTION_ALIASES
	ALIAS_CATALOG
	ALIAS_SCHEMA
	ALIAS_NAME
	JAVA_CLASS
	JAVA_METHOD
	DATA_TYPE
	COLUMN_COUNT
	RETURNS_RESULT
	REMARKS
	ID
FUNCTION_COLUMNS
	ALIAS_CATALOG
	ALIAS_SCHEMA
	ALIAS_NAME
	JAVA_CLASS
	JAVA_METHOD
	POS
	COLUMN_NAME
	DATA_TYPE
	TYPE_NAME
	PRECISION
	SCALE
	RADIX
	NULLABLE
	COLUMN_TYPE
	REMARKS
HELP
	ID
	SECTION
	TOPIC
	SYNTAX
	TEXT
	EXAMPLE
INDEXES
	TABLE_CATALOG
	TABLE_SCHEMA
	TABLE_NAME
	NON_UNIQUE
	INDEX_NAME
	ORDINAL_POSITION
	COLUMN_NAME
	CARDINALITY
	PRIMARY_KEY
	INDEX_TYPE_NAME
	IS_GENERATED
	INDEX_TYPE
	ASC_OR_DESC
	PAGES
	FILTER_CONDITION
	REMARKS
	SQL
	ID
	SORT_TYPE
IN_DOUBT
	TRANSACTION
	STATE
LOCKS
	TABLE_SCHEMA
	TABLE_NAME
	SESSION_ID
	LOCK_TYPE
RIGHTS
	GRANTEE
	GRANTEETYPE
	GRANTEDROLE
	RIGHTS
	TABLE_SCHEMA
	TABLE_NAME
	ID
ROLES
	NAME
	REMARKS
	ID
SCHEMATA
	CATALOG_NAME
	SCHEMA_NAME
	SCHEMA_OWNER
	DEFAULT_CHARACTER_SET_NAME
	DEFAULT_COLLATION_NAME
	IS_DEFAULT
	REMARKS
	ID
SEQUENCES
	SEQUENCE_CATALOG
	SEQUENCE_SCHEMA
	SEQUENCE_NAME
	CURRENT_VALUE
	INCREMENT
	IS_GENERATED
	REMARKS
	CACHE
	ID
SESSIONS
	ID
	USER_NAME
	SESSION_START
	STATEMENT
	STATEMENT_START
SETTINGS
	NAME
	VALUE
TABLES
	TABLE_CATALOG
	TABLE_SCHEMA
	TABLE_NAME
	TABLE_TYPE
	STORAGE_TYPE
	SQL
	REMARKS
	ID
TABLE_PRIVILEGES
	GRANTOR
	GRANTEE
	TABLE_CATALOG
	TABLE_SCHEMA
	TABLE_NAME
	PRIVILEGE_TYPE
	IS_GRANTABLE
TABLE_TYPES
	TYPE
TRIGGERS
	TRIGGER_CATALOG
	TRIGGER_SCHEMA
	TRIGGER_NAME
	TRIGGER_TYPE
	TABLE_CATALOG
	TABLE_SCHEMA
	TABLE_NAME
	BEFORE
	JAVA_CLASS
	QUEUE_SIZE
	NO_WAIT
	REMARKS
	SQL
	ID
TYPE_INFO
	TYPE_NAME
	DATA_TYPE
	PRECISION
	PREFIX
	SUFFIX
	PARAMS
	AUTO_INCREMENT
	MINIMUM_SCALE
	MAXIMUM_SCALE
	RADIX
	POS
	CASE_SENSITIVE
	NULLABLE
	SEARCHABLE
USERS
	NAME
	ADMIN
	REMARKS
	ID
VIEWS
	TABLE_CATALOG
	TABLE_SCHEMA
	TABLE_NAME
	VIEW_DEFINITION
	CHECK_OPTION
	IS_UPDATABLE
	STATUS
	REMARKS
	ID
```

Das sind aber nur die Systemtabellen und nicht die vom User, wie man in folgendem Bild sehen kann






Wie bekomme ich die User Tabellen auch noch mit rein? Hier in dem Beispiel die Test Tabelle, oder habe ich die Tabelle an sich falsch angelegt?

MfG
NiBurhe[/img]


----------



## Guest (13. Jan 2008)

Die User-Tabellen sind bei H2 im PUBLIC-Schema. Systemtabellen in INFORMATION_SCHEMA

```
printResultSet(dbmd.getTables(null, "PUBLIC", "%", null));
```


----------

