Einzelnen Beitrag anzeigen

Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#1

Firebird Datenbank erzeugen mit Bordmitteln und autoinc Feld

  Alt 30. Mär 2007, 13:59
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
  Mit Zitat antworten Zitat