Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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:
ausblenden 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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
ausblenden 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
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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



BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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



BeitragVerfasst: Fr 12.12.08 17:22 
Dann erweitere die eine Zeile mal ein wenig:
ausblenden Delphi-Quelltext
1:
gefunden := AnsiLowerCase(sqlabfrage.Fields[0].AsString) = AnsiLowerCase(Tablename);					
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 23.12.08 14:58 
Aber Ihr solltet ihm auch die einfache Varinate zeigen:

ausblenden 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;
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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



BeitragVerfasst: 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



BeitragVerfasst: 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



BeitragVerfasst: 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. :?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 23.12.08 16:05 
So krass wollte ich es nicht ausdrücken, aber Du hast Recht.