AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Firebird Datenbank erzeugen mit Bordmitteln und autoinc Feld
Tutorial durchsuchen
Ansicht
Themen-Optionen

Firebird Datenbank erzeugen mit Bordmitteln und autoinc Feld

Ein Tutorial von Mavarik · begonnen am 30. Mär 2007 · letzter Beitrag vom 29. Apr 2007
Antwort Antwort
Benutzerbild von Mavarik
Mavarik
Registriert seit: 9. Feb 2006
Hallo Zusammen!

Hier mein erstes Tutorial!
Diese Infos habe ich nur durch die Hilfe von mkinzler und zahlreichen google infos zusammen stellen können.

Die Aufgabe:
Mit Delphieigenen Komponenten eine Firebird Datenbank und Tabelle zu erzeugen. (embedded Version 2.01 von Firebird)

Vorbereitung:
Auf ein Formular werden folgende Komponenten geklicket...
Delphi-Quellcode:
IBDatabase1: TIBDatabase;
IBTable1: TIBTable;
IBTransaction1: TIBTransaction;
IBSQL1: TIBSQL;

DataSource1: TDataSource;
DBGrid1: TDBGrid; // Damit man auch ein Ergebniss sieht.

Button1: TButton;
Danach die "üblichen" verdächtigen miteinander verlinken...

IBTable1 -> IBDatabase1
IBTable1 -> IBTransaction1

IBTransaction1 -> IBDatabase1

IBSQL1 -> IBDatabase1
IBSQL1 -> IBTransaction1

DBGrid1 -> Datasource1
Datasource1 -> IBTable1

Button1 -> Button1Click

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  IBDatabase1.DatabaseName := 'GameDB.fdb';
  IBDatabase1.Params.Clear;
  IBDatabase1.Params.Add('USER ''SYSDBA'''); // Wenn hier USER_NAME angegeben wird funktioniert es nicht!
  IBDatabase1.Params.Add('PASSWORD ''masterkey'''); // Natürlich "nur" mit Leertaste
  IBDatabase1.Params.Add('PAGE_SIZE 4096');
  IBDatabase1.Params.Add('DEFAULT CHARACTER SET WIN1250');

  IBDatabase1.CreateDatabase;

  IBDatabase1.Connected := false;
  IBDatabase1.Params.Clear;
  IBDatabase1.Params.Add('USER_NAME=SYSDBA'); // Wenn hier USER angegeben wird funktioniert es nicht!
  IBDatabase1.Params.Add('PASSWORD=masterkey'); // Natürlich "nur" mit "="
  IBDatabase1.Connected := true;

  IBTransaction1.Active := true;

  with IBTable1 do begin
    active:=false; // Tablen-Zugriff muss auf jeden Fall geschlossen sein

    TableName:='HIGHSCORE'; // Tabellen Name IN UPPERCASE!!!
                                 // SONST FUNKTIONIERT ES NICHT
    with FieldDefs do begin // Eine kleine Tabelle um Highscores zu speichern...
      clear;
      Add('ID', ftInteger, 0, false); // AUTOINC Gibt es nicht, folgt später!!!
      Add('Game', ftString, 20, false);
      Add('UserID', ftString, 8, false);
      Add('PlayScore', ftInteger, 0, false);
      Add('PlayLevel', ftInteger, 0, false);
      Add('Playername', ftString, 40, false);
      Add('PlayerURL', ftString, 80, false);
      Add('PlayereMail', ftString, 80, false);
      Add('PlayerMessenger', ftString, 80, false);
      Add('Datum', ftDateTime, 0, false); // NICHT ETWAR TIMESTAMP das gibt es nicht...
    end;
    CreateTable;
  end;

  IBTransaction1.Commit; // MUSS ERSTMAL WEG SONST GEHT DER TRIGGER NICHT

  IBTransaction1.Active := true;
  IBSQL1.SQL.Text := 'CREATE GENERATOR autoinc;';
  IBSQL1.ExecQuery;
  IBSQL1.SQL.Text := 'SET GENERATOR autoinc TO 0;';
  IBSQL1.ExecQuery;
  IBSQL1.SQL.Clear;
  IBSQL1.SQL.Add('CREATE TRIGGER OhMannFirebird for HIGHSCORE');
  IBSQL1.SQL.Add('active before insert position 0');
  IBSQL1.SQL.Add('as');
  IBSQL1.SQL.Add('begin');
  IBSQL1.SQL.Add(' new.id = gen_id( autoinc, 1 );');
  IBSQL1.SQL.Add('end');
  IBSQL1.ExecQuery;
  IBTransaction1.Commit;

  // und mal einen Testdatensatz erzeugen

  IBTransaction1.Active := true;
  IBSQL1.SQL.Text := 'INSERT INTO HIGHSCORE("Game") VALUES (''Tetris'');';

  // ACH JA HIER MUSSTE ES NATÜRLICH AUCH WIEDER ANDERS SEIN...
  // Immer schön "Quoten" wenn die Felder kleine Buchstaben haben
  // Und bitte Strings natürlich auch immer in... Nein die brauchen wieder "nur" '

  IBSQL1.ExecQuery;
  IBTransaction1.Commit;

  IBTable1.Active := true; // So jetzt haben wir endlich eine MySQL Tabelle die Funktioniert wie "wir" es erwarten...
end;
Ich hoffe es erspart Euch die lange Sucherei!!!

Grüsse Frank
 
Benutzerbild von Alien426
Alien426

 
Turbo Delphi für Win32
 
#2
  Alt 29. Apr 2007, 10:26
Erst mal danke für das Tutorial. Es gibt ja für Firebird Embedded recht wenig hilfreiche Dokumentation.

Zu erwähnen gibt es noch, dass man bei den uses "DB" hinzufügen muss, da sonst ftInteger, ftString etc. nicht bekannt sind. Zumindest ist das so, wenn man Turbo Delphi Explorer einsetzt und alles "zu Fuß" einbauen muss. Vielleicht wäre auch zu überlegen, ob man diesen manuellen Weg noch etwas mit zusätzlichem Quelltext erleichtert.

Andererseits habe ich jetzt ein Datenbank-System gefunden, das mir tausend mal lieber ist als Firebird: SQLite.

Für "Embedded Datenbanken" scheint es mir optimal zu sein. Es gibt nur eine DLL, die man im Programmverzeichnis ablegen muss und der Zugriff ist z.B. mit simple Delphi wrapper for SQLIte 3 (es gibt auch andere Wrapper für Delphi) ein Kinderspiel.

Anfangs wird man vielleicht ein bisschen geschockt sein, wenn man vorher schon mit Datenbanken gearbeitet hat und von den SQLite-3-Datentypen erfährt, aber ich denke damit kann man leben...

SQLite hat keine Lizenz. Nicht mal ein Copyright.
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#3
  Alt 29. Apr 2007, 10:48
Zitat:
Zu erwähnen gibt es noch, dass man bei den uses "DB" hinzufügen muss, da sonst ftInteger, ftString etc. nicht bekannt sind. Zumindest ist das so, wenn man Turbo Delphi Explorer einsetzt und alles "zu Fuß" einbauen muss. Vielleicht wäre auch zu überlegen, ob man diesen manuellen Weg noch etwas mit zusätzlichem Quelltext erleichtert.
Liegt aber nicht an FB. Nimmt man einen lowlevel-Wrapper entfällt die VCL-DB-Abhängigkeit.
Zitat:
Andererseits habe ich jetzt ein Datenbank-System gefunden, das mir tausend mal lieber ist als Firebird
Und warum?
Zitat:
Es gibt nur eine DLL, die man im Programmverzeichnis ablegen muss und der Zugriff ist ... ein Kinderspiel.
Gilt doch auch für die anderen embedded-DBs
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Alien426
Alien426

 
Turbo Delphi für Win32
 
#4
  Alt 29. Apr 2007, 12:14
Zitat von mkinzler:
Zitat:
Zu erwähnen gibt es noch, dass man bei den uses "DB" hinzufügen muss, da sonst ftInteger, ftString etc. nicht bekannt sind. Zumindest ist das so, wenn man Turbo Delphi Explorer einsetzt und alles "zu Fuß" einbauen muss. Vielleicht wäre auch zu überlegen, ob man diesen manuellen Weg noch etwas mit zusätzlichem Quelltext erleichtert.
Liegt aber nicht an FB. Nimmt man einen lowlevel-Wrapper entfällt die VCL-DB-Abhängigkeit.
Hab ich ja auch nicht behauptet. Wenn man aber den Code für eigene Tests übernimmt und der Compiler meckert, dann ist man erst mal am Suchen.
Zitat von mkinzler:
Zitat:
Andererseits habe ich jetzt ein Datenbank-System gefunden, das mir tausend mal lieber ist als Firebird
Und warum?
Gute Dokumentation, einfache Handhabung, Command Line Interface für Linux und Windows.

Wie die Geschwindigkeit und Zuverlässigkeit im Vergleich zu anderen DBMS ist, weiß ich nicht aus eigener Erfahrung. Die Dokumentation lässt aber auf Gutes hoffen.

Man trägt die Pfade zum Wrapper in Delphi ein. Man kopiert die DLL ins Programmverzeichnis. Fertig.

Codebeispiel aus dem Wrapper:
Delphi-Quellcode:
uses
  ... SQLiteTable3 ...;

procedure TForm1.btnDisplayImageClick(Sender: TObject);
var
  slDBpath: String;
  sldb: TSQLiteDatabase;
  sltb: TSQLiteTable;
  iID: Integer;
  ms: TMemoryStream;
  pic: TJPegImage;
begin
  slDBPath := ExtractFilePath(Application.ExeName) + 'test.db';
  if not FileExists(slDBPath) then
  begin
    MessageDlg('test.db does not exist.',
     mtInformation,[mbOK],0);
    Exit;
  end;
  sldb := TSQLiteDatabase.Create(slDBPath);
  try
    sltb := slDb.GetTable('SELECT ID FROM testtable');
    try
      if not sltb.Count = 0 then
      begin
        MessageDlg('No rows in the test database.',
         mtInformation,[mbOK],0);
   Exit;
      end;
    iID := sltb.FieldAsInteger(sltb.FieldIndex['ID']);
  finally
    sltb.Free;
  end;
  sltb := sldb.GetTable('SELECT picture FROM testtable WHERE ID=' + IntToStr(iID));
  try
    ms := sltb.FieldAsBlob(sltb.FieldIndex['picture']);
    if (ms = nil) then
    begin
      MessageDlg('No image in the test database.',
       mtInformation,[mbOK],0);
      Exit;
    end;
    ms.Position := 0;
    pic := TJPEGImage.Create;
    pic.LoadFromStream(ms);
    self.Image1.Picture.Graphic := pic;
    pic.Free;
  finally
    sltb.Free;
  end;
  finally
    sldb.Free;
  end;
end;
Zitat von mkinzler:
Zitat:
Es gibt nur eine DLL, die man im Programmverzeichnis ablegen muss und der Zugriff ist ... ein Kinderspiel.
Gilt doch auch für die anderen embedded-DBs
Na dann entpack mal Firebird 2.0.1 Embedded Win32:
10x DLL, 3x CONF. Insgesamt 26 Dateien in 3 Ordnern.

Wo diese Dateien liegen dürfen, welche man überhaupt braucht und wie diese heißen müssen ("Just copy fbembed.dll into the directory with your application. Then rename it to either fbclient.dll or gds32.dll depending on your database connectivity software." -- Artikel zu FB Emb 1.5) ist mir unklar.
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#5
  Alt 29. Apr 2007, 12:24
grundsätzlich reicht hier auch eine Dll je nach Komponenten muß diese dann fbembed.dll, fbclient.dll or gds32.dll umbenennen.
FB hat mehr Features als SqlLite. Die Geschwindigkeit hängt von der Anwendung ab. Es gab dazu auch ein Test der Zeitschrift Toolbox.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz