AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird Generator/Trigger für Autoinc (Verständnis_Problem)
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Generator/Trigger für Autoinc (Verständnis_Problem)

Ein Thema von Satty67 · begonnen am 18. Feb 2009 · letzter Beitrag vom 29. Apr 2009
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#11

Re: Firebird Generator/Trigger für Autoinc (Verständnis_Prob

  Alt 28. Apr 2009, 16:49
Zitat von mkinzler:
Wegen fehlendem Commit sind die Tabellen bei der Anlage der Trigger noch nicht sichtbar
Ähä.. Commit? Also das, was die ZeosLib unter ExecSQL versteht, oder? Meine DoQuery-Funktion liest sich so:

Delphi-Quellcode:
procedure TORPDataBase.DoQuery(QueryStr: String);
begin
  fQuery := TZQuery.Create(nil);
  try
    with fQuery do
    begin
      Connection := fConnection;
      SQL.Add(QueryStr);
      ExecSQL;
    end;
  finally
    fQuery.Free;
  end;
end;
Der erste Aufruf von FireBirdAutoInc funktioniert und auch später in der DB wird die Spalte "ID" artig inkrementiert, wenn das INSERT INTO Statement so aussieht:

INSERT INTO NODES (NODE_ID, LAT, LON, TAGS) VALUES (:node_id, :lat, :lon, :tags) RETURNING "ID" Nur beim zweiten Aufruf scheitert es leider...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Firebird Generator/Trigger für Autoinc (Verständnis_Prob

  Alt 28. Apr 2009, 16:50
FireBird arbeitet mit Transaktion. Tabellen/Trigger sind Einträge in Systemtabellen, welche erst nach Commit der Transkation sichtbar werden.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#13

Re: Firebird Generator/Trigger für Autoinc (Verständnis_Prob

  Alt 28. Apr 2009, 17:13
*Grübeldigrübel*

Das heißt, vermutlich wäre hier ein fConnection.Connect mit anschließendem fConnection.Disconnect vor dem FireBirdAutoInc-Block angebracht, oder? Wenn dem so ist, dann habe ich immer noch ein Problem. Beim Programmstart prüfe ich, ob die Datenbank bereits existiert. Wenn nicht, soll sie angelegt werden.

Delphi-Quellcode:
function TORPDatabase.Connect(DBUser, DBPassword, DBHostName: string): boolean;
begin
  with fConnection do
  begin
    Protocol := 'firebird-2.0';
    ReadOnly := false;
    User := DBUser;
    Password := Password;
    Database := fCompleteDBPath;
    HostName := DBHostName;
    if not FileExists(fCompleteDBPath) then
      CreateEmptyDB;
    Connect;
    Result := Connected;
  end;
end;

procedure TORPDataBase.CreateEmptyDB;
begin
  with fConnection do
  begin
    Properties.Add('CreateNewDatabase=CREATE DATABASE ' + QuotedStr(Database)
      + ' USER ' + QuotedStr(User) + ' PASSWORD ' +
      QuotedStr(Password) + ' PAGE_SIZE 4096');
  end;
  FillDB;
end;

procedure TORPDataBase.FillDB;
begin
  DoQuery('CREATE TABLE MEMBERS (ID BIGINT NOT NULL, MEMBER_ID BIGINT,"TYPE" VARCHAR(255), REF BIGINT,"ROLE" VARCHAR(255));');
  DoQuery('CREATE TABLE NODES (ID BIGINT NOT NULL, NODE_ID BIGINT, LAT FLOAT, LON FLOAT, TAGS VARCHAR(20000));');
  DoQuery('CREATE TABLE RELATIONS (ID BIGINT NOT NULL, RELATION_ID BIGINT, MEMBERS VARCHAR(5000), TAGS VARCHAR(5000));');
  DoQuery('CREATE TABLE TAGS (ID BIGINT NOT NULL, "KEY" VARCHAR(255), "VALUE" VARCHAR(255));');
  DoQuery('CREATE TABLE WAYS (ID BIGINT NOT NULL, WAY_ID BIGINT, NODES VARCHAR(5000), TAGS VARCHAR(5000));');

  fConnection.Connect;
  fConnection.Disconnect;


  FireBirdAutoInc(fConnection,'NODES','ID');
  FireBirdAutoInc(fConnection,'TAGS','ID');
end;
Wenn die Datenbank nicht existiert, dann wird zuerst CreateEmptyDB() und dann FillDB() aufgerufen. Springt die Funktion wieder zurück zu Connect() in TORPDatabase.Connect(), dann erhalten ich folgende Meldung:

Code:
---------------------------
saxxmltest
---------------------------
SQL Error: I/O error for file "G:\Dokumente und Einstellungen\Ich\Anwendungsdaten\OpenRoutePlanner\DB\ORP_MAIN.fdb" database or file exists. Error Code: -902. Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements The SQL: CREATE DATABASE 'G:\Dokumente und Einstellungen\Ich\Anwendungsdaten\OpenRoutePlanner\DB\ORP_MAIN.fdb' USER 'SYSADMIN' PASSWORD '' PAGE_SIZE 4096;
---------------------------
OK  
---------------------------
Als hätte er das CREATE DATABASE Statement noch nicht ausgeführt....
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Firebird Generator/Trigger für Autoinc (Verständnis_Prob

  Alt 28. Apr 2009, 18:02
Der Fehler tritt bereits bei CREATE DATABASE auf... alles danach ist erst mal noch nicht interessant.
Also beim Anlegen der Datei 'G:\Dokumente und Einstellungen\Ich\Anwendungsdaten\OpenRoutePlanner \DB\ORP_MAIN.fdb'

Passwort hast Du selbst ausgeklammert? masterkey bei embbed Firebird.

Evtl. die Datenbankdatei mal in einem anderen Ordner anlegen.

€: Edit...steht ja da... Du versuchst eine neue Datenbank anzulegen, aber die Datenbankdatei existiert bereits. Wenn die Datenbank ORP_MAIN.fdb noch leer ist, dann löschen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: Firebird Generator/Trigger für Autoinc (Verständnis_Prob

  Alt 28. Apr 2009, 18:08
Das Passwort ist bei embedded egal, da ja nur der Benutzernamen ausgewertet wird
Markus Kinzler
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Firebird Generator/Trigger für Autoinc (Verständnis_Prob

  Alt 28. Apr 2009, 18:14
Kein Passwort nötig, Ok

Also denke ist einfach, dass Du beim Testen versuchst, vorhandene Elemente nochmal anzulegen. Die erste Fehlermeldung könnte bedeuten, dass du den Trigger identisch nochmal anlegen willst. Die letzte, dass Du die bereits vorhandene Datenbank nochmal erzeugen willst.

Also falls noch beim Testen, die Datenbank löschen und nochmal alles neu anlegen lassen. Für später wäre eine Abfrage nötig... Datenbank existiert bereits, Trigger existiert bereits.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#17

Re: Firebird Generator/Trigger für Autoinc (Verständnis_Prob

  Alt 28. Apr 2009, 18:20
Äh, ja, die Fehlermeldung habe ich ja auch gelesen. Ich lösche die Datenbank, und dann erscheint der Fehler. Und ich weiß nicht, wo ich zum zweiten Mal eine Datenbank erstelle. Oder habe ich gerade was falsch verstanden?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#18

Re: Firebird Generator/Trigger für Autoinc (Verständnis_Prob

  Alt 28. Apr 2009, 18:34
also nach "properties.add('CreateNew..." müsste doch gleich ein Connect folgen?

Du kannst die Tabellen nicht in der erzeugten, aber nicht geöffneten Datenbank anlegen. Also zConnection.Connect vor FillDB.

Dein Ablauf:
CreateEmptyDB; -> FillDB
Connect;
Delphi-Quellcode:
if not FileExists(fCompleteDBPath) then
begin
  CreateEmptyDB;
  Connect;
  FillDB;
end else
  Connect;
...und FillDB aus CreateEmptyDB rausnehmen.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#19

Re: Firebird Generator/Trigger für Autoinc (Verständnis_Prob

  Alt 28. Apr 2009, 19:44
Zitat von Satty67:
Du kannst die Tabellen nicht in der erzeugten, aber nicht geöffneten Datenbank anlegen. Also zConnection.Connect vor FillDB.
Doch, das ging vorher einwandfrei. Die Tabellen waren da, und ich konnte sie mit Daten füllen. Erst als der Autoinc hinzukommen sollte, kamen die Probleme. MySQL gefällt mir in dem Zusammenhang besser...

Ich habe deinen Vorschlag umgesetzt, er hilft jedoch nicht alleine. Denn ich bekomme so immer noch die Meldung:

Code:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt saxxmltest.exe ist eine Exception der Klasse EZSQLException mit der Meldung 'SQL Error: unsuccessful metadata update DEFINE TRIGGER failed attempt to store duplicate value (visible to active transactions) in unique index "RDB$INDEX_8". Error Code: -607. This operation is not defined for system tables. The SQL: CREATE TRIGGER AUTOINC_TRG for TAGS
active before insert position 0
as
begin
  new.ID = gen_id( TAGS_AUTOINC, 1 );
end
; ' aufgetreten.
---------------------------
Anhalten  Fortsetzen  Hilfe  
---------------------------
Ich musste einen kleinen Teil deiner Prozedur anpassen:

SQL.Add('CREATE TRIGGER AUTOINC_TRG for '+Table); wurde zu

SQL.Add('CREATE TRIGGER '+Table+'AUTOINC_TRG for '+Table); So funktioniert es einwandfrei.

P.S.: Danke für den Hinweis auf "Password". Hatte im Eifer des Gefechts glatt das "DB" vergessen...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#20

Re: Firebird Generator/Trigger für Autoinc (Verständnis_Prob

  Alt 28. Apr 2009, 19:53
Das ist eben der Unterschied, ob man DB-globales Autoinc oder eines je Tabelle verwenden möchte. Wenn Letzteres, müssen alle DB-Objekte (also auch Trigger und Generatoren) eindeutig benannt sein.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 21:37 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