![]() |
Re: Problem mit geschlossener Datenmenge!
Guten Morgen,
Zitat:
In dem Code passiert ja im Grunde nur folgendes. Die Transaktion wird geschlossen, die an diese Komponente angeschlossenen Table/Query "verlieren" die für sie gültige Transaktion und die Datenmenge wird geschlossen. Ob ein "Refresh" ausreicht um die Datenmenge zu öffnen wage ich zu bezweifeln, kenne die TIBC-Komponenten aber nicht. Allerdings müsste in jedem Fall die Transaction-Komponente auf Automatik stehen, d.h. Transaktionen sollen automatisch gestartet werden. Grüße Wolfgang |
Re: Problem mit geschlossener Datenmenge!
Hallo,
Das Refresh kommt doch bestimmt noch von der BDE, oder ? Dort wird die Transaktion automatisch wieder gestartet. Mach mal vor dem Refresh ein Transaction.Start (oder wie immer das bei dir heisst). Wie meine Vorredner (Vorschreiber) gesagt haben, ist TTable eine schlechte Wahl für SQL-Server. Du wirst immer wieder damit Probleme bekommen. Die BDE hat hier dire sehr viel abgenommen. Heiko |
Re: Problem mit geschlossener Datenmenge!
Ok, ich probier das mal mit den TIBCQuerries! Aber wieso werden dann überhaupt IBCTables angeboten, wenn es sowieso nicht richtig funktioniert bzw. sehr schlecht.
|
Re: Problem mit geschlossener Datenmenge!
Also ich weiss nicht, an der Funktion ist doch Einiges nicht richtig.
Hier mal meine Version:
Delphi-Quellcode:
Sollte die Tabelle geschlossen sein, dann ist State = dsInactive.
procedure PostFlush(Table : TIBCTable);
begin with Table do begin if (State = dsEdit) or (State = dsInsert) then begin Post; // Daten speichern // wenn keine Daten mit Post abgesendet wurden gibt es auch keinen Grund // eine Transaktion zu "commiten" if (Connection <> nil) then begin if Connection.InTransaction then Connection.Commit; end else begin Transaction.Commit; end; end; end; if Active then Refresh; end; Dies wird von meiner Version berücksichtigt; in der orginalen Version aber nicht. Ich sehe auch nicht wirklich, weshalb man hier mit Transactions arbeitet; es macht wenig Sinn. Transactions überspannen mehr als einen Datensatz. Genau das aber wird hier missachtet. Hier ein Beispiel für sinnvolle Anwendung von Transactions. Es wird ein Betrag von einem Konto ab- und auf ein anderes Konto aufgebucht. Zusätzlich wird noch mitgeloggt.
Delphi-Quellcode:
Transaction.Begin;
try if not TabKonto.Locate('KontoNr', absender, []) then Raise Exception.Create(...); TabKonto.Edit; TabKonto['Betrag'] := TabKonto['Betrag'] - Ueberweisung; TabKonto.Post; if not TabKonto.Locate('KontoNr', empfaenger, []) then Raise Exception.Create(...); TabKonto.Edit; TabKonto['Betrag'] := TabKonto['Betrag'] + Ueberweisung; TabKonto.Post; TabLogging.append; TabLogging['info'] := 'Überweisung Betrag bla, bla,......' TabLogging.Post; Transaction.Commit; // Alles ok, alle Änderungen dauerhaft in die Datenbank except // bei einem Fehler ALLES zurücknehmen Transaction.rollback; end; |
Re: Problem mit geschlossener Datenmenge!
Noch schöner wäre es, auf das with zu verzichten.
|
Re: Problem mit geschlossener Datenmenge!
Alles klar ich probier das mal aus direkt mit Post und dann Commit
|
Re: Problem mit geschlossener Datenmenge!
Übrigens hab mir noch mal ein par Sachen zu IBDAC durchgelesen, das Commiten machen die Komponenten automatisch.
Also wenn ich da Commit weglasse, nur Poste dann geht das einwandfrei! |
Re: Problem mit geschlossener Datenmenge!
Kann mir einer Sagen wieso dieser Fehler auftaucht?
Das kommt an der Stelle wo ich ein TIBCQuery.Open; mache. --------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Unknown.exe ist eine Exception der Klasse EIBCError mit der Meldung ' Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 59 OPEN' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe --------------------------- |
Re: Problem mit geschlossener Datenmenge!
Hallo,
Zitat:
Hm, doch nicht. Wie sollen wir dir ohne Quellcode helfen ? Machst du vielleicht ein Insert oder Update ? Dann kein Open, sondern ExecSQL . Heiko |
Re: Problem mit geschlossener Datenmenge!
Delphi-Quellcode:
@hoika:
with DM.qCommon do begin
SQL.Clear; SQL.Add('delete from INDEXES'); ExecSQL; SQL.Clear; SQL.Add('insert into INDEXES (IND) values (:Ind)'); Prepare; for i := 0 to ol2Scan.Count - 1 do begin ParamByName('Ind').AsInteger := ol2Scan.GetItem(i).IndOrg; ExecSQL; end; Unprepare; SQL.Clear; SQL.Add('select INDORGSRC,INDORGDST,INDDN,BLOCK'); SQL.Add('from ILLUSION where INDORGSRC in'); SQL.Add('(select IND from INDEXES)'); Open; try while not EOF do begin i := 0; FoundIllusion := False; while i < ol2Scan.Count do begin oList := ol2Scan.GetItem(i); if FieldByName('IndOrgSrc').AsInteger = oList.IndOrg then for j := 0 to slDiagn.Count - 1 do begin if FieldByName('IndDiagn').AsInteger = slDiagn.GetItem(j).Ind then begin if FieldByName('Block').AsInteger = 0 then begin oList.IndOrg := FieldByName('IndOrgDst').Asinteger; end else begin ol2Scan.Delete(i); // We kill 'em. Dec(i); end; FoundIllusion := True; break; end; end; if FoundIllusion then break; Inc(i); end; Next; end; finally Close; end; SQL.Clear; SQL.Add('select IND,NAME,INDETA,INDGRP,FGROUP,OPEN,POL'); SQL.Add('from IMAGE where IND in'); SQL.Add('(select IND from INDEXES)'); Open; // AN DIESER STELLE SCHEINT DER FEHLER ZU SEIN, wenn ich OPEN rauskommentiere geht er weiter, aber lädt mir nicht die Daten für eine TChecklistBox usw. try while not EOF do begin ......... Mit ExecSQL kommt genau der selbe Fehler. Mir ist gerade auf geafallen das in der Zeile: SQL.Add('select IND,NAME,INDETA,INDGRP,FGROUP,OPEN,POL'); ein Open vorkommt, wird sich der Fehler daraufbeziehen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz