SQLTransaction ändert sich von selbst

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

SQLTransaction ändert sich von selbst

Beitrag von AlterMann »

Hallo

Seit einem Update auf Lazarus 1.6 habe ich wieder einmal ein Problem an einer Stelle wo ich niemals gerechnet hätte. :evil:

In einer Form mit je zwei SQLQueries (SQLQuery1 und SQLQuery2) sowie zwei zugehörigen SQLTransactions (1+2) springt die Eigenschaft "Transaction" im Objektinspektor immer ohne mein Zutun von "Transaction1" auf "Form1.Transaction1".

Wäre an sich nicht dramatisch, aber da ich während SQLQuery1 offen ist, auch eine Routine von Form1 aufrufe, die Form1.SQLQuery1 benutzt, erhalte ich eine Fehlermeldung (operation cannot be performed on an inactive data set) da die Transaction (Form1.SQLTRansaction1) dort geschlossen wird.

Ich hoffe das ist, auch wenn man es lesen muß, verständlich? :shock:

Weiß wer Rat?

LG
Christian

Edit:
Ich mußte gerade (mit Schrecken) feststellen, daß in ALLEN Forms die eine SQLQuery beinhalten, die Eigenschaft Transaction auf Form1.SQLTransaction1 gesetzt wurde! :(
Früher war alles besser. Und aus Holz!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQLTransaction ändert sich von selbst

Beitrag von af0815 »

Transaktionen nur auf die Connection verwenden, denn du hast ja (normalerweise) nur eine Verbindung zum Server. Somit bei einer Connection nur eine Transaktion verwenden. Oder hast du spezielle Gründe ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: SQLTransaction ändert sich von selbst

Beitrag von AlterMann »

af0815 hat geschrieben:Transaktionen nur auf die Connection verwenden, denn du hast ja (normalerweise) nur eine Verbindung zum Server. Somit bei einer Connection nur eine Transaktion verwenden. Oder hast du spezielle Gründe ?


Naja. Das passiert ja eigentlich (ungewollt) da sich die Eigenschaft "Transaction" automatisch bei allen SQLQueries auf Form1.SQLTransaction setzt.

Dadurch entsteht aber eben auch besagter Fehler.

Es ist auch so, daß seit einem (länger zurückliegenden) Update von Lazarus, änderungen in der Datenbank nach Beendigung des Programms wieder weg waren.
Das lag an einem nicht mehr vorhandenem Autocommit.

Seither verwende ich bei allen Queries folgende Workarounds:

Code: Alles auswählen

procedure TForm20.SQLQuery1AfterClose(DataSet: TDataSet);
begin
 SQLTransaction1.Commit;
end;
 
procedure TForm20.SQLQuery1BeforeOpen(DataSet: TDataSet);
begin
 if not SQLTransaction1.Active then SQLTransaction1.StartTransaction;
end;
 


Möglich daß dies jetzt die neuen Faxen erklärt.
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: SQLTransaction ändert sich von selbst

Beitrag von AlterMann »

Und auch wenn das als Workaround wohl gehen wird.
Es kann doch nicht Absicht sein, daß der Wert in der Eigenschaft von selbst ändert, oder?
Früher war alles besser. Und aus Holz!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQLTransaction ändert sich von selbst

Beitrag von af0815 »

Wo liegt den deine Transaction ? Auf Form1 ?

Ich verwende jedenfalls als Basisi für die Connection und Transcaction immer ein Datenmodul, (meist) auch für die Queries, damit die an einem zentralen Ort verwaltet werden.
Das Datenmodul kümmert sich dann auch um die Erstellung/Wartung der DB. Also alles zentral gehalten.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: SQLTransaction ändert sich von selbst

Beitrag von AlterMann »

Naja, ich hatte bisher (weil ich dachte das müßte so sein (ich weiß über MySQL gerade nur immer soviel wie ich gerade brauche :oops: )) für jede SQLQuerie auf jeder Form eine eigen Transaction.
Die hab ich zur Entwicklungszeit zugeordnet und gut war's.

Da das Projekt seit vier Jahren gewachsen ist (und inzwischen auch schon ein wenig unübersichtlich geworden ist) kommt es vor, daß ich von einer Form direkt auf eine SQLQuerie von Form zugreife, auf einer anderen eine eigen Querie anlege usw.

Im konkreten Fall hat die Form zwei Queries wovon eine innerhalb der while-Schleife die die Daten der anderen ausliest, schreibend auf die Datenbank zugreift.
(Ist eine eher komplizierte Geschichte wo Teile eines Lagers wertrichtig (= älteste Eingänge als erstes) entnommen werden müssen, egal ob der Ein- oder der Ausbuchvorgang vorher oder nachher stattfindet.)

In der procedure die schreibend zugreift, wird aber auch eine procedure von Form1 aufgerufen die (mit ihrer eigenen Querie) einen Eintrag in eine LOG-Tabelle schreibt und die Änderung protokolliert.
Das führt jetzt (da Lazarus für alle Queries auf allen Forms Form1.SQLTransaction eingetragen hat, dazu, daß "operation cannot be performed on an inactive data set" ausgelöst wird sobald die lesende Querie der Form SQLQuerie.next ausführen soll.

Ich habe jetzt probehalber die Protokollierung auskommentiert und es geht auch. Aber wer weiß an wievielen Stelle des Programmes noch solche Fallen lauern und erst noch auftreten. :(
Früher war alles besser. Und aus Holz!

Antworten