Autor Beitrag
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Di 16.05.06 22:41 
Ich habe mich bis jetzt mit ADO (Access) und ADS Datenbank beschäftigt.

Als nächtes will ich mich nun mit der Firebird Datenbank beschäftigen und habe dazu schon einige Tutorial durchgelesen und folgendes herausgefunden um eine neue Datenbank anzulegen.

Um die Datenbank anzulegen habe ich mir folgende Prozedure geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  ProgPath, DBName, LoginName, PW: string;

begin
  ProgPath := ExtractFilePath(paramstr(0));

  DBName := ProgPath + 'TestDB.fdb';
  LoginName := 'USER';
  PW:= 'xxxxxx';

  Form1.Con1.Disconnect;
  Form1.Con1.Database:=DBName;
  Form1.Con1.Protocol :='Firebird-1.5';
  Form1.Con1.Properties.Add('CreateNewDatabase=CREATE DATABASE ' +
                            DBName + ' USER ' + QuotedStr(LoginName) +
                            ' PASSWORD ' + QuotedStr(PW) + 
                            ' PAGE_SIZE 4096 ' + 
                            ' DEFAULT CHARAcTER SET ISO8859_1');
  Form1.Con1.Connect;

End;


Ich hoffe mal, dass das soweit richtig ist, wenn nicht bitte melden.

Danach nehme ich mir einen Query und schreibe die 'Create Table' Sachen rein.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
     try
        Form1.QPers.SQL.Clear;
        Form1.QPers.SQL.Add(cCreateDB1);
        Form1.QPers.ExecSQL;
      except
      else
        MessageDlg(Format('FEHLER!%sDie Tabelle DB1 konnte nicht angelegt werden!', [#13#10]), mtError, [mbCancel], 0);
      end;

      try
        Form1.QPers.SQL.Clear;
        Form1.QPers.SQL.Add(cCreateDB2);
        Form1.QPers.ExecSQL;
      except
      else
        MessageDlg(Format('FEHLER!%sDie Tabelle DB2 konnte nicht angelegt werden!', [#13#10]), mtError, [mbCancel], 0);
      end;


In cCreateDB1 habe ich z.B. folgendes drin stehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
const
  cCRLF = #13#10// Zeilenvorschub..

  cCreateDB1 = 'CREATE TABLE Pers(' + cCRLF // Name der Datei
    + 'PersID PRIMARY KEY,'      + cCRLF 
    + 'Vorname     varchar(60),' + cCRLF // Text Länge 60
    + 'Name        varchar(60),' + cCRLF // Text Länge 60
    + 'Strasse     varchar(60),' + cCRLF // Text Länge 60
    + 'PLZ         varchar(5),'  + cCRLF // Text Länge 5
    + 'Ort         varchar(60),' + cCRLF // Text Länge 60
    + 'Tel1        varchar(40),' + cCRLF // Text Länge 40
    + 'Tel2        varchar(40),' + cCRLF // Text Länge 40
    + 'Markierung  varchar(60),' + cCRLF // Text Länge 60
    + 'Datum       DateTime,'    + cCRLF // Datum mit Zeit
    + 'Info        Memo)';               // Info


Ich hoffe dass dies so richtig ist.

Als nächstes bekomme ich das Problem, dass es bei Firebird keine autoinc-funktion gibt, die mir meine ID beim anlegen eines neuen Datensatzes hochzählt.

Im 'Getting startet with firebird' habe ich folgendes gelesen um das durch einen Trigger zu realisieren.
Verstanden habe ich das aber nicht.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
In den Trigger einbauen:
CREATE GENERATOR my_gen_id;
SELECT gen_id(my_gen_id,0) FROM...
SET GENERATOR my_gen_id TO [some_value];

Create Trigger autinc_id for new_one
active before insert position 0
AS
BEGIN
if(NEW.col1 IS NULL) THEN
NEW.col1=GEN_ID(my_gen_id,1);
END


Ist es sinnvoll das einzubauen, oder soll ich einfach vor dem append auf letzten Datensatz springen und die letzte ID lesen und dann erhöhen für die neue ID.

Oder gibt es noch etwas einfacheres um eine eindeutige ID pro Table zu bekommen ?

Falls es noch etwas wichtiges zu sagen gibt zu einem Firebirdanfänger dann nur zu, bin für jede Info dankbar, die mir später zeit und ärger erspart wenn die Applikation fertig ist.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 17.05.06 01:19 
Nicht schon wieder. 8) Erkläre mir zuerst mal bitte zu welchem Zweck das ganze ist. Also eine DB überhaupt mit selbstgestricktem Programm anzulegen, sonst ist es IMHO zwecklos überhaupt was zu sagen. Das hier gilt ja wohl ?

user profile iconSmileySN hat folgendes geschrieben:
Falls es noch etwas wichtiges zu sagen gibt zu einem Firebirdanfänger dann nur zu, bin für jede Info dankbar, die mir später zeit und ärger erspart wenn die Applikation fertig ist.


Dann muß ich Dir allerdings sagen, daß ich die DB mit IBExpert mitsamt Triggern usw. also richtig angelegt hätte in derselben Zeit, die es dauert das hier zu schreiben ! Für Dich bedeutet es als Anfänger : <1 Tag Einarbeitung und dann auch in 2 Min. fertig zu sein. Also sage bitte zuerst eine nachvollziehbare Erklärung warum das unbedingt so umständlich gehen muß. Statt eine EXE-Datei zu kopieren, kann man die selbstverständlich auch byteweise mit einem Hex-Editor erstellen. Vielleicht ist das Beispiel extrem genug. :mrgreen:

_________________
Gruß
Hansa
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Mi 17.05.06 07:37 
Hi,

user profile iconSmileySN hat folgendes geschrieben:

Ist es sinnvoll das einzubauen, oder soll ich einfach vor dem append auf letzten Datensatz springen und die letzte ID lesen und dann erhöhen für die neue ID.


Du arbeitest mit Firebird, einer richtigen Multi-User SQL-Datenbank, nicht mehr mit Access! Um an eine eindeutige ID zu kommen, musst Du Generatoren einsetzen, entweder über einen Trigger oder Du holst Dir die ID selbst. Ein Select ID funktioniert auf keinen Fall, spätestens dann nicht mehr wenn 2 User gleichzeitig einen Insert machen.

SChau Dich mal auf meiner Seite um, da findest Du einige Tutorials zum Thema Firebird, SQL und Einstieg. Wenn Du dann konkrete Fragen hast, dann melde Dich nochmal. Die Frage bzgl. der eindeutigen ID in Firebird ist hier im Forum auch schon oft beantwortet worden...

Lemmy
SmileySN Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Mi 17.05.06 14:05 
Bisher habe ich meist kleine DB-Applikationen geschrieben, die ich dann als .exe Datei weggegeben habe und vor Ort wurde dann die Datenbank erstellt. Das war praktisch, da eine Installation entfällt und auch nur eine Datei weitergegeben weren muss.
Bei CS-Datenbanken sehe ich ein, dass das keinen Sinn mehr macht, da ja der DB-Server sowieso installiert werden muss.

Mit den Tools für Firebird wie IBExpert usw. hatte ich mich noch nicht beschäftigt und muss einsehen, dass es Sinn macht damit zu arbeiten.

Einen Bericht über das ID anlegen mit einem Trigger habe ich gefunden und werde das mal über den IB-Expert ausprobieren.
Dort habe ich aber nur die Trial version gefunden, die Personal wurde zwar erwähnt, ich habe aber kein download davon entdeckt. (Naja im suchen von Infos hab ich ja immer Pech)

Danke an Hansa, der mich auf die Unsinnigkeit meines Tuns hingewiesen hat. Darum habe ich ja auch gefragt, ich will ja gleich von Anfang an den richtigen Weg gehen.

Die Webseite von Lemmy ist wirklich toll, prima Infos und lauter Sachen, die man auch wirklich gebrauchen kann.

Werde Euch dann weiter nerven, wenn ich wieder nicht weiterkomme, bis dahin Danke erst mal.