![]() |
Firebird Datenbank erzeugen mit Bordmitteln und autoinc Feld
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:
Danach die "üblichen" verdächtigen miteinander verlinken...
IBDatabase1: TIBDatabase;
IBTable1: TIBTable; IBTransaction1: TIBTransaction; IBSQL1: TIBSQL; DataSource1: TDataSource; DBGrid1: TDBGrid; // Damit man auch ein Ergebniss sieht. Button1: TButton; IBTable1 -> IBDatabase1 IBTable1 -> IBTransaction1 IBTransaction1 -> IBDatabase1 IBSQL1 -> IBDatabase1 IBSQL1 -> IBTransaction1 DBGrid1 -> Datasource1 Datasource1 -> IBTable1 Button1 -> Button1Click
Delphi-Quellcode:
Ich hoffe es erspart Euch die lange Sucherei!!!
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; Grüsse Frank :coder: |
Re: Firebird Datenbank erzeugen mit Bordmitteln und autoinc
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: ![]() 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 ![]() ![]() Anfangs wird man vielleicht ein bisschen geschockt sein, wenn man vorher schon mit Datenbanken gearbeitet hat und von den ![]() SQLite hat keine Lizenz. Nicht mal ein Copyright. |
Re: Firebird Datenbank erzeugen mit Bordmitteln und autoinc
Zitat:
Zitat:
Zitat:
|
Re: Firebird Datenbank erzeugen mit Bordmitteln und autoinc
Zitat:
Zitat:
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:
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." -- ![]() |
Re: Firebird Datenbank erzeugen mit Bordmitteln und autoinc
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz