Entwickler-Ecke

Datenbanken - IBEVENT mit Firebird 1.5


Delphi_Rainer - Di 12.06.07 14:26
Titel: IBEVENT mit Firebird 1.5
Hallo,

Ich versuche in Delphi 7 ein Ereignis einer Datenbank mit IBevent zu bekommen.
Dies klappt auch für eine gewisse Zeit.

Vorgehensweise:

Eine Anwendung auf ein Client PC schreibt Daten auf ein Server PC.
Die Anwendung mit der Datenbank auf dem Server PC läuft in einem Thread.

Nach ein paar Einträge in die Datenbank bekomme ich die Fehlermeldung "Invalid transaction handle" (explicit transaction started).


Entferne ich die die IBEvent Komponente aus dem Sourcecode und übersetzte die Anwendung neu so tritt kein Fehler auf.

Muss man beim erhalt des Events die Transaction neu starten ?


Was mache ich falsch ?

Kann mir jemand ein Sourcecode geben ?


mkinzler - Di 12.06.07 16:03

Du könntest uns auch ein bisschen Code zeigen


Delphi_Rainer - Di 12.06.07 16:13

Hier ist der Sourcecode


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
 //Erstellen des Event in Datenbank
 with ibsql1 do
    begin
     SQL.Clear;
     sql.Add('Create Trigger POST_NEW_ORDER'+inttostr(line+1)+' for    Protokoll'+inttostr   (line+1));
     sql.Add('Active After Insert Position 0');
     sql.Add('AS BEGIN ');
     sql.Add('POST_EVENT "POSTING'+inttostr(line+1)+'";'); 
     sql.Add('END');
     Execquery;
    end;

 // Erstellung der Event Komponente
 IBEVENTS1:=TIBEVENTS.Create(nil); 
 IBEvents1.AutoRegister:=false;
 IBEvents1.Database:=database;
 IBEvents1.OnEventAlert:=EVENTALLERT

 Nach öffnen der database

 IBEvents1.Events.Clear;
 IBEvents1.UnRegisterEvents;
 for i:=0 to Lin_anzahl-1 do
   IBEvents1.Events.Add('POSTING'+inttostr(i+1));
 IBEvents1.RegisterEvents

//Meine Event Prozedur "Eventallert"

procedure Protokoll_thread.EVENTALLERT(Sender: TObject; EventName: String;
  EventCount: Integer; var CancelAlerts: Boolean);
begin
 try
 if Eventname='POSTING1' then
  begin
   form1.PROTOKOLL_CHANGE[0]:=true;
  end
 else if Eventname='POSTING2' then
  begin
   form1.PROTOKOLL_CHANGE[1]:=true;
  end
 else if Eventname='POSTING3' then
  begin
   form1.PROTOKOLL_CHANGE[2]:=true;
  end
 else if Eventname='POSTING4' then
  begin
   form1.PROTOKOLL_CHANGE[3]:=true;
  end
 else if Eventname='POSTING5' then
  begin
   form1.PROTOKOLL_CHANGE[4]:=true;
  end
 else if Eventname='POSTING6' then
  begin
   form1.PROTOKOLL_CHANGE[5]:=true;
  end
 else if Eventname='POSTING7' then
  begin
   form1.PROTOKOLL_CHANGE[6]:=true;
  end
 else if Eventname='POSTING8' then
  begin
   form1.PROTOKOLL_CHANGE[7]:=true;
  end;

 except
  Synchronize(ERROR_OUTPUT_PROTO);
 end;
end;


Alles wird im Thread erzeugt.

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


Delphi_Rainer - Di 19.06.07 16:28

Der Fehler mit invalid transaction handle ist jetzt behoben.

Ich bekomme jetzt die Fehlermeldung "Error in gds32.dll" wenn ich ein disconnect auf die Datenbank mache.

Kann mir jemand helfen ???