Autor |
Beitrag |
daywalker0086
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Fr 12.12.08 15:51
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
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: 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.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: 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
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: 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
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: 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.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Fr 12.12.08 17:36
Ich zolle dir Respekt, es funktioniert
sehr geil. Ich dank dir erstmal wenn ich noch ne Frage haben sollt weis ich ja jetzt an wen ich mich wenden muss...
|
|
micesch
Hält's aus hier
Beiträge: 2
|
Verfasst: 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; |
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 23.12.08 15:00
Das ist aber nicht der eigentliche Sinn des Exception-Handlings.
|
|
micesch
Hält's aus hier
Beiträge: 2
|
Verfasst: 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ß.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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. 
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 23.12.08 16:05
So krass wollte ich es nicht ausdrücken, aber Du hast Recht.
|
|