# DatabaseMetaData



## salvatore1969 (10. Mrz 2019)

Hallo an alle Java-Freunde  ist möglich wenn ich eine Tabelle mit NetBeans  erstellte  Code in einer msql-Datenbank einfüge in mein fall Tabelle1 ,wenn ich es über DatabaseMetaData in einer Tabelle, die ich selbst mit NetBeans erstellt habe   diese spiegele , in den spalten
neben dem Tabellennamen (Tabelle1) auch Name, Datum, von wem es erstellt wurde, den ich natürlich beim erstellen der neue Tabelle diese Daten eingeben  soll.  Im Moment kann ich nur den Tabellennamen lesen mit dem Code, den ich unten gepostet habe  Danke.
Spalte 1 | Spalte 2| Spalte 3
Tabelle1  |   Name |   Datum


```
public void Show_Metadata_In_JTable() throws SQLException
    {
Connection con=getConnection();
 
  DefaultTableModel model = (DefaultTableModel)Tabelle_Jtabel.getModel();
      try{
        String[] types = {"TABLE"};
        DatabaseMetaData metadata = con.getMetaData();
        ResultSet resultSet = metadata.getTables(null, null, "%", types);
         while (resultSet.next())
            {
          Vector row = new Vector();
                row.addElement( resultSet.getString(3) );
                model.addRow(row);
            }
         } catch (SQLException ex) {
               Logger.getLogger(Admin_system.class.getName()).log(Level.SEVERE, null, ex);
            
            }
         }
```


----------



## mihe7 (10. Mrz 2019)

Warum nicht? Du musst die Informationen natürlich irgendwo speichern.


----------



## salvatore1969 (10. Mrz 2019)

Aber wenn ich  über DatabaseMetaData  dem Tabellennamen (Tabelle1) zb. 
spiegele auf der gleiche reie der Tabelle1 die andere info habe Name1,Datum1
Nehmen wier an  es wurden mit NetBeans erstellte Code in einer msql-Datenbank
3 Tabellen erstellt  (tabelle1,tabelle2,tabelle3) und ich spiegele  die 3 tabellen 
daneben will ich  die andere info haben auf der gleiche Tabelle.
vielleicht _habe_ ich _mich nicht richtig ausgedrückt, Entschuldigung für meinen nicht so guten Deutsch_
Spalte 1 | Spalte 2| Spalte 3
Tabelle1 | Name1 | Datum1
Tabelle2 | Name2 | Datum3
Tabelle3 | Name3 | Datum3


----------



## mihe7 (10. Mrz 2019)

Ich habe Dich schon verstanden. Du fügst ja jeweils eine Zeile zur JTable hinzu. Die besteht aktuell ja nur aus dem Tabellennamen. Du kannst aber doch weitere Werte dazunehmen, z. B.

```
String tableName = resultSet.getString(3);
String creator = "Name1";
String dayOfCreation = "2019-01-01";
Vector row = new Vector();
row.addElement( tableName );
row.addElement( creator );
row.addElement( dayOfCreation );
model.addRow(row);
```
Du musst also lediglich creator und dayOfCreation in Abhängigkeit von tableName aus Deiner DB ermitteln.


----------



## salvatore1969 (10. Mrz 2019)

Habe ich es richtig verstanden  wenn ich zb.
--create table tabelle1 -erstelle  ,creator und dayOfCreation nicht in dieser erstelte tabelle eingeben  soll
sondern in ein anderen erstelte --create table tabelleanderendaten - eingeben soll.


----------



## salvatore1969 (10. Mrz 2019)

Oder wen ich zb  create table tabelle1 -erstelle parallel dazu die
anderen daten   creator und dayOfCreationnicht  in anderen  ort speicher, haber wie
mache ich das wenn ich über DatabaseMetaData spiegele
tabelle1  in der gleiche  reie  von den anderen creator und dayOfCreation  ist


----------



## Thallius (10. Mrz 2019)

Ich kann leider nicht verstehen was das Ziel deines Anliegens sein soll aber ich kann dir aus langjähriger Erfahrung sagen, das das erstellen von Datenbank Tabellen dynamisch im code nur in 1 vom 1000 fällen sinnvoll ist. In allen anderen Fällen handelt es sich dabei um ein falsches Konzept.

Gruß

Claus


----------



## salvatore1969 (10. Mrz 2019)

Danke für die hilfe ,ich wolte erreichen wenn ein benutzer über eine
benutzeroberfläche  eine Tabelle in eine datenbank erstellt
das   über DatabaseMetaData nicht nur den Name der Tabelle
hole sondern auch anderen daten die der benutzer  in der benutzoberfläche
eingibt , oder gibt es eine andere metode?


----------



## mihe7 (11. Mrz 2019)

salvatore1969 hat gesagt.:


> Habe ich es richtig verstanden  wenn ich zb.
> --create table tabelle1 -erstelle  ,creator und dayOfCreation nicht in dieser erstelte tabelle eingeben  soll
> sondern in ein anderen erstelte --create table tabelleanderendaten - eingeben soll.


Ja, selbstverständlich. Der Ersteller und der Zeitpunkt der Erstellung sind Metadaten über die erstellte Tabelle. Dafür braucht es eine separate Tabelle.

Du machst also etwas wie

```
CREATE TABLE table_meta (
    table_name VARCHAR(255) NOT NULL,
    creator    VARCHAR(255) NOT NULL,
    created    TIMESTAMP    DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT pk_table_meta PRIMARY KEY (table_name)
);
```
Optional kannst Du gleich noch die Metadaten über die Metadaten-Tabelle selbst speichern (der Ersteller ist in folgendem INSERT allerdings der Datenbank-Benutzer):

```
INSERT INTO table_meta(table_name, creator)
    SELECT table_name, CURRENT_USER
      FROM INFORMATION_SCHEMA.TABLES
     WHERE lower(table_name)='table_meta';
```

Immer, wenn Dein Benutzer nun eine Tabelle erstellt, musst Du eine Zeile in table_meta einfügen:

```
INSERT INTO table_meta(table_name, creator) VALUES (:name_der_neuen_tabelle, :benutzername_des_erstellers);
```

Nachtrag: allerdings sehe ich die Sache wie @Thallius. Warum erstellt ein Benutzer in Deiner Anwendung Tabellen? Was macht Deine Anwendung?


----------



## salvatore1969 (13. Mrz 2019)

Danke mihe7 für die hilfe, es funktioniert so weit
Haber wen der Benutzer eine neue tabelle hinzufügt 
und diese Tabellen name exisistiert habe ich den eintrach doppelt
ich habe es mit ---CREATE TABLE IF NOT EXISTS-- probiert 
haber wird iignoriert wen der tabelle Name exisistiert wird 
trotzdem ausgeführt ,villeicht liegt es an meinen -- XAMPP Version: 5.6.30--


----------



## Thallius (13. Mrz 2019)

Das geht gar nicht das du zwei Tabellen mit dem gleichen Namen erstellst. Mich wundert immer mehr was du da machen willst...


----------



## mihe7 (13. Mrz 2019)

salvatore1969 hat gesagt.:


> Haber wen der Benutzer eine neue tabelle hinzufügt
> und diese Tabellen name exisistiert habe ich den eintrach doppelt


Kann es sein, dass Du mit "Tabelle" eigentlich Datensatz/Record meinst?


----------



## salvatore1969 (13. Mrz 2019)

Danke Thalius, Benutzer1 gibt über textfelder in ein JavaForm eingaben
die in tabelle1 der Db gespeichert werden soweit so gut.
Benutzer2 gibt über textfelder in den gleichen  JavaForm eingaben
die in tabelle2 der Db gespeichert.

Der punkt ist die tabellen werden  nicht über die administration von 
XAMPP Version: 5.6.30 von mir erstellt sondern von Den Benutzer
selber erstell .

Pro Benutzer eine  dbTabelle  die er selber  über JavaForm erstellt
das funktioniert alles .
Um das schöner zu machen ,die auswall  der  Tabellen wolte ich 
nicht über das  Combobox  damit ich die in Jtable sehe
Sonder anders.
aber vielleicht _habe_ ich _mich nicht richtig ausgedrückt_


----------



## mihe7 (13. Mrz 2019)

Du musst nur ein einziges mal die Tabelle table_meta (z. B. über phpMyAdmin) anlegen. Wenn ein Benutzer eine neue Tabelle anlegt, fügst Du per INSERT den Namen der neuen Tabelle und den Namen des Benutzers in table_meta ein.


----------



## salvatore1969 (13. Mrz 2019)

Das Funkioniert auch , Wenn  haber ein Benutzer eine neue Tabelle anlegt  und die Tabelle existiert wird natürlich
nicht in db eingefügt, haber in die table_meta  ja im Datensatz/Record  alz hätte ich zwei  gleichen namen


----------



## mihe7 (13. Mrz 2019)

salvatore1969 hat gesagt.:


> Wenn haber ein Benutzer eine neue Tabelle anlegt und die Tabelle existiert wird natürlich
> nicht in db eingefügt, haber in die table_meta ja im Datensatz/Record alz hätte ich zwei gleichen namen


Du kannst jetzt über die Tabelle table_meta einfach feststellen, ob die Tabelle bereits existiert... Dein Programm muss doch lediglich z. B. über die Tabelle table_meta feststellen, ob die neue Tabelle bereits existiert. Wenn ja: Fehlermeldung. Wenn nein: neue Tabelle anlegen und in table_meta einfügen.


----------



## salvatore1969 (13. Mrz 2019)

Ok danke gute Lösung


----------



## Trjavnamen (16. Apr 2019)

Nun ich denke in der Uhrsprungsdatei müßten die zwei Informationen(Benutzer/Datum) mit eingebaut werden. Das ändern sollte dann nur dem jeweiligen Benutzer zur verfügung stehen und neue Datensätze mit Benuzer u. Datum persistent werden. Nur der Administrator sollte dann die Daten bestätigen oder löschen können.


----------



## Trjavnamen (16. Apr 2019)

Bestätigt der Abministrator wechselt der Besitz und Benutzer auf Administrator. Das kann natürlich auch mit einem Radiobutton dem nur dem Administrator zur verfügung steht und ebenfalls in der Tabelle eingebaut wird bewerkstelligt werden. Vorteil er könnte die Daten dem Ursprünglichen Mitarbeiter durch ein einfaches klicken wieder zur verfügung stellen wenn die Daten nochmals korrigiert werden müssen.


----------

