Tabellen automatisch erstellen wenn sie nicht existieren

FawKes100

Aktives Mitglied
Hallo zusammen,
ich arbeite im Augenblick an einem kleinen Chatbot für Discord bzw. Twitch.
Dabei habe ich allerdings ein kleines Problemchen: Ich möchte die Datenbank die dazu erforderlich ist nicht manuell neu anlegen müssen, wenn ich z.B den Bot auf einen anderen Server ziehe.
Deswegen wollte ich dass der Bot am Anfang beim "Hochfahren" überprüft ob die Datenbank die gewünschte Tabelle enthält und wenn dies nicht der Fall ist, soll er eine neue Tabelle anlegen. Problem ist allerdings, dass er keine Tabelle anzulegen scheint, denn wenn ich mir die Datenbank über phpmyadmin anschaue, beinhaltet die Datenbank nach wie vor keine Tabelle. Führe ich den Befehl zum Einfügen der Tabelle direkt in phpmyadmin aus, funktioniert er und legt eine Tabelle an..
Zunächst frage ich also die Daten der Tabelle ab:

Java:
 private static String[] getAllTablesOnDatabase(DatabaseConnector databaseConnector)
    {
        databaseConnector.executeStatement("SHOW TABLES");
        String[] tables;
        try
        {
            String[][] data = databaseConnector.getCurrentQueryResult().getData();
            tables = new String[data.length];
            for(int i=0; i<data.length; i++)
            {
                tables[i] = data[i][0];
            }
        }catch(NullPointerException e)
        {
            warn("No Tables exists in Database..");
            tables = new String[0];
        }
        return tables;
    }

Anschließend überprüfe ich ob die Tabelle vorhanden ist und wenn nicht erstelle ich sie neu:

Java:
 private static void checkBotNutzer(DatabaseConnector databaseConnector, String[] tabels)
    {
        boolean isRegistrated = false;
        for(String string : tabels)
        {
            if(string.equalsIgnoreCase("botnutzer"))
            {
                isRegistrated = true;
            }
        }

        if(!isRegistrated)
        {
            info("Database does not exist correctly. Create Bot-Nutzer-Table..");
            databaseConnector.executeStatement("CREATE TABLE `phoeniixheart`.`botnutzer` ( `BotNutzerID` INT NOT NULL , `NutzerName` TEXT NOT NULL , `Pass` TEXT NOT NULL , `EMail` TEXT NOT NULL ) ENGINE = InnoDB;");
            String[] updatedTabels = getAllTablesOnDatabase(databaseConnector);
            for(String table : updatedTabels)
            {
                if(table.equalsIgnoreCase("botnutzer"))
                {
                    info("Table 'botnutzer' exist now correctly..");
                    return;
                }
            }
        }
    }

warn und info sind nur kleine DEBUG-Methoden, die eine schöne System.out bzw. System.err Ausgabe machen..
Hier noch den Inhalt der Klasse DatabaseConnector, die die Verbindung zur Datenbank aufbaut und Abfragen tätigt:
Java:
package database;

import java.sql.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DatabaseConnector{
    private Connection connection;
    private QueryResult currentQueryResult = null;
    private String message = null;

    private String ip;
    private int port;
    private String databaseName;
    private String userName;
    private String password;

 
    public DatabaseConnector(String pIP, int pPort, String pDatabase, String pUsername, String pPassword){
        try {
        

            Class.forName("com.mysql.jdbc.Driver");

          
            connection = DriverManager.getConnection("jdbc:mysql://"+pIP+":"+pPort+"/"+pDatabase + "?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CEST", pUsername, pPassword);

        } catch (Exception e) {
            message = e.getMessage();
        }
        this.ip = pIP;
        this.port = pPort;
        this.databaseName = pDatabase;
        this.userName = pUsername;
        this.password = pPassword;
    }


    public void connect()
    {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            connection = DriverManager.getConnection("jdbc:mysql://" + ip + ":" + port + "/" + databaseName + "?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin", userName, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public boolean isConnected()
    {
        try {
            if(connection == null || !connection.isClosed()  )
            {
                return false;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return true;
    }

    public void disconnect()
    {
        if(connection != null)
        {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            connection = null;
        }
    }

    public void executeStatement(String pSQLStatement){
        debug("Querry: " + pSQLStatement);
        //Altes Ergebnis loeschen
        currentQueryResult = null;
        message = null;

        try {
            //Neues Statement erstellen
            Statement statement = connection.createStatement();

            //SQL Anweisung an die DB schicken.
            if (statement.execute(pSQLStatement)) { //Fall 1: Es gibt ein Ergebnis

                //Resultset auslesen
                ResultSet resultset = statement.getResultSet();

                //Spaltenanzahl ermitteln
                int columnCount = resultset.getMetaData().getColumnCount();

                //Spaltennamen und Spaltentypen in Felder uebertragen
                String[] resultColumnNames = new String[columnCount];
                String[] resultColumnTypes = new String[columnCount];
                for (int i = 0; i < columnCount; i++){
                    resultColumnNames[i] = resultset.getMetaData().getColumnLabel(i+1);
                    resultColumnTypes[i] = resultset.getMetaData().getColumnTypeName(i+1);
                }

                //Queue fuer die Zeilen der Ergebnistabelle erstellen
                Queue<String[]> rows = new Queue<String[]>();

                //Daten in Queue uebertragen und Zeilen zaehlen
                int rowCount = 0;
                while (resultset.next()){
                    String[] resultrow =  new String[columnCount];
                    for (int s = 0; s < columnCount; s++){
                        resultrow[s] = resultset.getString(s+1);
                    }
                    rows.enqueue(resultrow);
                    rowCount = rowCount + 1;
                }

                //Ergebnisfeld erstellen und Zeilen aus Queue uebertragen
                String[][] resultData = new String[rowCount][columnCount];
                int j = 0;
                while (!rows.isEmpty()){
                    resultData[j] = rows.front();
                    rows.dequeue();
                    j = j + 1;
                }

                //Statement schließen und Ergebnisobjekt erstellen
                statement.close();
                currentQueryResult =  new QueryResult(resultData, resultColumnNames, resultColumnTypes);

            } else { //Fall 2: Es gibt kein Ergebnis.
                //Statement ohne Ergebnisobjekt schliessen
                statement.close();
            }

        } catch (Exception e) {
            //Fehlermeldung speichern
            message = e.getMessage();
        }
    }

 
    public QueryResult getCurrentQueryResult(){
        return currentQueryResult;
    }

    public String getErrorMessage(){
        return message;
    }

    public void close(){
        try{
            connection.close();
        } catch (Exception e) {
            message = e.getMessage();
        }
    }

    private void debug(String out)
    {
        LocalDateTime localDateTime = LocalDateTime.now();
        String date = localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE);
        String time = localDateTime.format(DateTimeFormatter.ISO_LOCAL_TIME);
        System.out.println("[" + date + " " + time + "] [DEBUG] [Database-Connector] " +  out);
    }

}
 

Dompteur

Top Contributor
Hast du dir die Exception in DatabaseConnector.executeStatement schon angesehen ?
Wird die geworfen ? Was steht in der Exception ?
 

FawKes100

Aktives Mitglied
Hast du dir die Exception in DatabaseConnector.executeStatement schon angesehen ?
Wird die geworfen ? Was steht in der Exception ?
Exceptions werden im DatabaseConnector keine geworfen. Wenn ich mir die Errormessage ausgeben lasse, nach der Abfrage der Tabellen, erhalte ich ein "null". Passt auch zur NullPointer-Exeption, die geworfen wird, denn das 2-Dimensionale String Array scheint auf null zuverweisen.. Wenn ich versuche durch zu iterieren bekomme ich die NullPointer-Exception..
Problem Nr. 1 scheint also zu sein, dass der Befehl "SHOW TABLES" nicht vernünftig ausgeführt wird, bzw. fehlerhafte Daten übermittelt. Seltsamerweise funktioniert der Befehl in PhpMyAdmin problemlos..

Zum Datenbanksystem, welches ich verwende kann ich nicht viel sagen. Ich benutze aber XAMPP um es zustarten. Daher nehme ich mal an, dass es sich um MySQL handelt.
 

Dompteur

Top Contributor
Ich meinte diese Stelle:
Code:
public class DatabaseConnector{
    private String message = null;
...
    public void executeStatement(String pSQLStatement){
        message = null;
...
        try {
...
        } catch (Exception e) {
            //Fehlermeldung speichern
            message = e.getMessage();
        }
    }

Wird diese Exception wirklich nicht ausgelöst ?
Ich würde zum Testen da ein "e.printStackTrace()" reinschreiben oder eine Ausgabe für das Logfile.

Ich würde dir generell empfehlen, in allen Catch-Blöcken eine Ausgabe ins Logfile zu machen. So wie dein Code aussieht, werden Fehlercodes gesetzt und später (möglicherweise) ignoriert. Du bekommst also den Fehler erst mit einer gewissen Verspätung mit.
 

FawKes100

Aktives Mitglied
Jo hab das gerade mal getestet mit der Ausgabe des Stacktraces.. Wird tatsächlich schon im Database-Connector geworfen..
Die Klasse vom Database-Connector hatte ich noch von der Schule, hab da nicht viel dran geändert - warum auch immer die den Stacktrace da nicht mit ausgeben lassen..

Mache eigentlich immer in catchblöcken Ausgaben in die Konsole, nur da hab ich es übersehen :D

Jedenfalls wird die NullpointerException hier geworfen:
Statement statement = connection.createStatement();
Schätze mal dass die connection auf null verweist. Folglich ist also keine Verbindung aufgebaut..

*Edit: Frage jetzt vor dem Ausführen des Statements ab, ob der DatabaseConnector auch wirklich ne Verbindung zur Datenbank hat. Ist letzteres nicht der Fall, bau ich eben schnell ne neue Verbindung auf, sodass sich das Problem nun geklärt haben sollte..

Vielen Dank aufjedenfall für die Hilfe und den Tipp mit der Ausgabe in den Catch-Blöcken!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
Ataria SQLite Werte aus zwei Tabellen zusammenführen Datenbankprogrammierung 8
I H2 - GUI Tool.... sehe aber keine Tabellen Datenbankprogrammierung 2
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
H JDBC Tabellen ausgeben Datenbankprogrammierung 8
Kirby.exe Tabellen Zeilen combinen und splitten Datenbankprogrammierung 3
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
M Sql Tabellen erstellen Datenbankprogrammierung 3
C Mapping mit Annotations von 2 Tabellen Datenbankprogrammierung 22
W Problem mit Insert in zwei Tabellen Datenbankprogrammierung 8
L Join zweier Tabellen in SQL Datenbankprogrammierung 2
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
I Oracle Wie ermitteln, welche Benutzer-(!)Tabellen in einer DB sind? Datenbankprogrammierung 1
H Brauche Hilfe beim Mappen von 3 Tabellen a 1:n mit hbm.xml. Datenbankprogrammierung 34
D JPQL- Query über mehrere Tabellen Datenbankprogrammierung 7
feinperligekohlensaeure MySQL Dynamische Tabellen. Wie kann man es besser machen? Datenbankprogrammierung 3
O HSQLDB Eine Entität, mehrere Tabellen Datenbankprogrammierung 8
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
D Count(*) auf 2 Tabellen anwenden Datenbankprogrammierung 7
D MySQL Many to Many Tabellen in Java abbilden? Datenbankprogrammierung 4
V SQLite 2 Tabellen vergleichen und nur Unterschiedliche Sätze rausgeben. Datenbankprogrammierung 31
F Tabellen verbinden Datenbankprogrammierung 13
L0MiN Wie kann ich eine bestimmte Seite aus verschiedenen Excel-Tabellen in eine neue Exceldatei kopieren? Datenbankprogrammierung 1
U Kann die Tabellen nicht finden Datenbankprogrammierung 0
D umschalten zwischen verschiedene Tabellen Datenbankprogrammierung 1
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
E Kann man, wenn man in DB2 Tabellen erstellt hat für dessen auch einen Command-File erstellen? Datenbankprogrammierung 1
M JDBC Tabellen mit Boolean Spalten können nicht erstellt werden. DB Updaten - wie? Datenbankprogrammierung 6
T Tabellen von nicht mehr vorhandenen Entities werden generiert Datenbankprogrammierung 0
J MySQL Workbench Tabellen werden verschoben Datenbankprogrammierung 1
M MySQL Tabellen dynamisch erstellen Datenbankprogrammierung 12
T Ähnliche Wrapperklassen + DB-Tabellen Datenbankprogrammierung 1
K HSQLDB Einzelne Tabellen abfragen? Datenbankprogrammierung 4
T Tabellen Alias Datenbankprogrammierung 7
M MySQL Insert über mehrere Tabellen Datenbankprogrammierung 7
J Tabellen in Tabellen finden Datenbankprogrammierung 4
S versionierte Tabellen Datenbankprogrammierung 2
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
I Was ist besser: Tabellen oder Spalten Datenbankprogrammierung 1
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
M Vergleich von Daten in verschiedenen Tabellen Datenbankprogrammierung 1
C SQL-Statement SELECT über 3 Tabellen Datenbankprogrammierung 5
G 2 Tabellen und ein spezieller Eintrag Datenbankprogrammierung 2
T Fehler beim ausgeben von Tabellen Inhalt Datenbankprogrammierung 9
T 2 Tabellen aus 2 Datenbanken miteinander vergleichen Datenbankprogrammierung 6
I MySQL Vergleich über mehrere Tabellen! Join? Datenbankprogrammierung 6
R PostgreSQL Tabellen hinzufügen, falls nicht vorhanden Datenbankprogrammierung 3
E Tabellen nacheinander auslesen Datenbankprogrammierung 10
D Übersichtliche Zuweisung von Daten in Tabellen Datenbankprogrammierung 17
S 2 Tabellen zu einer zusammenführen, INSERT INTO Fehler Datenbankprogrammierung 5
A Zugriff auf DB-Tabellen mit Objekten Datenbankprogrammierung 3
K SQL tabellen auswahl in jfreechart Datenbankprogrammierung 2
0 Alle Tabellen aus DB lesen Datenbankprogrammierung 2
F Komplexer Tabellen-Join und Ausgabe in Excel Datenbankprogrammierung 17
I Master/Detail Tabellen mit JDBC und Swing Datenbankprogrammierung 10
H Fortlaufende Nummerierung innerhalb mehrerer Tabellen Datenbankprogrammierung 4
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
Consuelo Verbinden von zwei Tabellen, foreign key Datenbankprogrammierung 4
O MySQL sql Datei einzelner Tabellen erzeugen (über Java Programm) Datenbankprogrammierung 6
T Kleine Tabellen für schnellere abfragen? Datenbankprogrammierung 3
G SQL Abfrage über mehrere Tabellen Datenbankprogrammierung 28
H SQL Abfrage - zwei tabellen vergleichen. Datenbankprogrammierung 2
R MySQL Unbenutzte Tabellen/Spalten herausfinden Datenbankprogrammierung 7
I mit Java SQL Attribute / Tabellen erstellen Datenbankprogrammierung 17
C SQL String zwei Tabellen vergleichen und gleiche Zeile löschen Datenbankprogrammierung 25
R hibernate Frage zu configFile-Pfad und Groß/Kleinschreibung von Postgres-Tabellen Datenbankprogrammierung 8
J Mit einer Abfrage Worte suchen die in Zwei Tabellen enthalten sind Datenbankprogrammierung 5
F Einzelne Sql- Tabellen sichern (lokal) Datenbankprogrammierung 2
I MySQL - Anzahl Tabellen heraus finden Datenbankprogrammierung 6
B Es werden keine Tupel in Tabellen abgelegt Datenbankprogrammierung 2
S SQL inner join bei >10 Tabellen über 2 Variablen Datenbankprogrammierung 2
S HSQLDB Kopiere Tabellen Datenbankprogrammierung 2
Guybrush Threepwood Nachträgliches Ändern von Variableneigenschaften in (gefüllten) Tabellen Datenbankprogrammierung 3
J Tabellen auflisten, die in einer Datenbank enthalten sind Datenbankprogrammierung 16
T DB2 delete/update über 2 Tabellen Datenbankprogrammierung 2
T SQL Abfrage: Zeige alle Values von bestimmten Tabellen Datenbankprogrammierung 11
R Datenbanken, Tabellen normalisieren. Datenbankprogrammierung 1
A Datenbankzugriffe, mehr Tabellen Datenbankprogrammierung 12
oliver1974 JPA, JTable und 2 DB-Tabellen... Datenbankprogrammierung 2
J Starre Datenbankstruktur oder Tabellen bei Bedarf neu erzeugen? Datenbankprogrammierung 5
X Abfrage über 2 Tabellen mit Tücken Datenbankprogrammierung 3
G verbindung 2er Tabellen Datenbankprogrammierung 3
M Auswerten über drei Tabellen Datenbankprogrammierung 2
H Inserts in 2 Tabellen 1:n Datenbankprogrammierung 6
G Mehrere Tabellen abfragen Datenbankprogrammierung 7
M JavaDB/Derby: Tabellen erstellen Datenbankprogrammierung 8
G 2 Tabellen in einer 1:n Verbindung Datenbankprogrammierung 2
M insert in 2 tabellen Datenbankprogrammierung 7
MQue Metadaten für Tabellen in der Datenbank Datenbankprogrammierung 5
D aus mehreren sql tabellen matchen und sortieren Datenbankprogrammierung 6
G 2 Tabellen zusammenfügen wie? Datenbankprogrammierung 8
G Tabellen-Dokument als Datenbank Datenbankprogrammierung 2
S MySQL: Abfrage auf 2 Tabellen durch join Datenbankprogrammierung 5
Y Hibernate - Mapping der Beziehung zwischen 2 Tabellen Datenbankprogrammierung 2
ARadauer tabellen kommentar ausgeben Datenbankprogrammierung 2
S Mysql abfrage über 2 tabellen. Datenbankprogrammierung 10
Y Hibernate - Werte aus 2 Tabellen laden Datenbankprogrammierung 29
S Postgres und die Ursprungstabelle bei vererbten Tabellen Datenbankprogrammierung 4
M Mehrere Tabellen zusammenführen Datenbankprogrammierung 4
A Index bzw. Indizes von Tabellen herausfinden Datenbankprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben