Entwickler-Ecke

Datenbanken - MYSQL prüfen ob Datenbank bereits existiert


daywalker0086 - Fr 12.12.08 15:51
Titel: MYSQL prüfen ob Datenbank bereits existiert
Und ich wieder, ich möchte prüfen ob eine MYSQL Datenbank bereits existiert und wollte das so machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 
if (sqlabfrage.SQL.text:='Create DATABASE'+Datenbank+'')  = true then
    begin
      sqlabfrage.SQL.Text:='CREATE TABLE `test1` ('+
    '`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,'+
    '`vorname` TEXT NOT NULL,'+
    '`name` TEXT NOT NULL,'+
    '`adresse` TEXT NOT NULL,'+
    '`wohnort` TEXT NOT NULL,'+
    '`plz` INT NOT NULL'+    ');';
sqlabfrage.ExecSql;
  end;


Leider bringt er mir Fehler in meiner if Zeile: incompatible typen

Wie kan nich das in den Griff bekommen?
Ich nutze die Zeos Komponenten


Delete - Fr 12.12.08 16:05

Das sieht so aus, als ob Du versucht hast, ein PHP-Script 1 zu 1 nach Delphi zu übernehmen.

[edit] MySQL erlaubt übrigens auch so etwas:
CREATE DATABASE IF NOT EXISTS DBName[/edit]


daywalker0086 - Fr 12.12.08 16:38

Kann ich überhaupt mit dem Befehl sqlabfrage.SQL.Text:='Create DATABASE'''+Datenbank+''' ';

Eine Datenbank erzeugen kommt nämlich immer eine Fehlermeldung.
Wenn die Datenbank einmal existiert kann ich Tabellen ohne Probleme anlegen aber eben keine Datenbank da der irgendwie wenn er sich connected schon eine haben will.


Delete - Fr 12.12.08 16:39

Ob das mit ZEOS geht, kann ich Dir leider nicht auf Anhieb sagen. Evtl. helfen da die Tutorials auf dsdt.info weiter.


daywalker0086 - Fr 12.12.08 16:52

Mit dem Tutorial arbeite ich aber da sind ja nur die grundlegenden Sachen erklärt und es wird nur der Befehl .SQL.Text:= verwendet
Jetzt stehe ich schonwieder wieder vor dem Problem einer if Anweisung

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 
if sqlabfrage.SQL.Text:='SHOW TABLES (froeling);' = existiert then //So in der Art 
 showmessage('Existiert')
else
        sqlabfrage.SQL.Text:='CREATE TABLE `Daten` ('+
      '`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,'+
      '`Bezeichnung` TEXT NOT NULL,'+
      '`Wert` INT NOT NULL'+    ');';
        sqlabfrage.ExecSql;


Ich brauch irgend nen Rückgabewert aber mit welchem Befahl komm ich an ihn das ist die große Frage.
Wenn ic hdas weis dann wär das top


Delete - Fr 12.12.08 16:55

Sry, ich verstehe immer noch nicht ganz, was Du da vorhast. Du willst wissen, ob es eine Tabelle bereits gibt und wenn nicht, ggf. anlegen, oder?


daywalker0086 - Fr 12.12.08 17:00

Jap, genau das will ich, wenn sie existiert soll er das machen, wenn nicht soll er was anderes machen.
eben if then else


Delete - Fr 12.12.08 17:10

Auch da ginge es mit CREATE TABLE IF NOT EXISTS <Tablename>, aber Du scheinst noch grundlegende Probleme zu haben.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
sqlabfrage.SQL.Text:='SHOW TABLES';
sqlabfrage.Open;
gefunden := false;
while not (sqlabfrage.EOF or gefunden) do
  begin
    gefunden := sqlabfrage.Fields[0].AsString = Tablename;
    sqlabfrage.Next;
  end;
sqlabfrage.Close;
if not gefunden then
  begin
    sqlabfrage.SQL.Text:='CREATE TABLE `Daten` ('+
    '`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,'+
    '`Bezeichnung` TEXT NOT NULL,'+
    '`Wert` INT NOT NULL'+    ');';
    sqlabfrage.ExecSql;  
  end
else
  ShowMessage('Tabelle existiert');


Frei Hand heruntergetippt, daher ohne Gewähr


daywalker0086 - Fr 12.12.08 17:20

Hm dein Code funzt leider nicht. Es kommt ein SQL Fehler das die Tabelle bereits existiert. also arbeitet er die Schleifen nicht richtig ab.
Vorallem, is ja nen Haufen Code nur um zu schauen ob eine Tabelle vorhanden ist oder nicht.


Delete - Fr 12.12.08 17:22

Dann erweitere die eine Zeile mal ein wenig:

Delphi-Quelltext
1:
gefunden := AnsiLowerCase(sqlabfrage.Fields[0].AsString) = AnsiLowerCase(Tablename);                    


daywalker0086 - Fr 12.12.08 17:36

Ich zolle dir Respekt, es funktioniert :lol:
sehr geil. Ich dank dir erstmal wenn ich noch ne Frage haben sollt weis ich ja jetzt an wen ich mich wenden muss...


micesch - Di 23.12.08 14:58

Aber Ihr solltet ihm auch die einfache Varinate zeigen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
sqlabfrage.SQL.Text:='CREATE TABLE `Daten` ('...')';

try
   sqlabfrage.ExecSql; // bei Fehler Sprung in den except-Zweig ...
   MachWas;            // ... ansonsten geht's hier weiter
except
   MachWasAnderes;
end;


Delete - Di 23.12.08 15:00

Das ist aber nicht der eigentliche Sinn des Exception-Handlings.


micesch - Di 23.12.08 15:20

Mann, ich habe noch nie eine schnellere Antwort gesehen.

Ich gebe Dir absolut Recht, aber in diesem Fall wird ja gar kein Exception-Handling gebraucht.
Es wird nur ein Statement abgeschickt, das entweder gut oder schlecht zurückliefert.

Ich spare somit Zeit, wenn ich "try - except" "mißbrauche", da ich keine Query öffen, durchsuchen und wieder schließen muß.


Delete - Di 23.12.08 15:29

Erstens heißt Exception "Ausnahme" und sollte auch so behandelt werden. Zweitens bekommst Du so nur mit, dass Deine Query einen Fehler auslöste, aber nicht, welchen.


Delete - Di 23.12.08 16:04

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Das ist aber nicht der eigentliche Sinn des Exception-Handlings.

Richtig, wie hat mal jemand gesgt: "Das ist wie als wenn man mit geschlossenen Augen mit dem Auto auf eine Ampelkreuzung fährt und wenn es kracht war rot."

Exceptions sind dazu gedacht Ausnahmefehler zu behandeln auf die man keinen Einfluss hat als Programmierer. Zum Beispiel öffne ich eine Datei zum Lesen zbnd während ich lese, wird sie von einem anderen Progranmm gelöscht. Auf der anderen Seite sind sie nicht als ein Ersatz für eine allgemeine Fehlerbehandlung gedacht. Bei der Verwendung von Exception wird durch den Compiler sehr viel zusätzlicher Code erzeugt. Dies ist der Performance natüprlcih nicht unbedingt zuträglich. Und schön ist es auch nicht. Es zeigt eigentlich viel mehr, dass der Programmierer gar nicht weiß, was er da macht bzw. wie man es richtig macht. Da wird dann eben mal schnell der Ciode in einen Exceptionblock gepackt -- das Allheilmittel für jeden kaputten Code. :?


Delete - Di 23.12.08 16:05

So krass wollte ich es nicht ausdrücken, aber Du hast Recht.