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 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; MachWas; 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
DeddyH hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!