AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Problem mit geschlossener Datenmenge!
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit geschlossener Datenmenge!

Ein Thema von daredd · begonnen am 9. Jun 2009 · letzter Beitrag vom 12. Jun 2009
Antwort Antwort
Seite 2 von 3     12 3      
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#11

Re: Problem mit geschlossener Datenmenge!

  Alt 10. Jun 2009, 07:06
Guten Morgen,

Zitat von mkinzler:
Zitat:
Aber das Commit schließt nicht die Tabelle oder?
Eigentlich nicht.
hm... bist Du da sicher? Über das commit der angeschlossenen Transaktion verliert die Table/Query die Transaktion in der Aktionen ausgeführt werden. Damit müsste die Table/Query automatisch eine neue Transaktion starten.

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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#12

Re: Problem mit geschlossener Datenmenge!

  Alt 10. Jun 2009, 08:28
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
Heiko
  Mit Zitat antworten Zitat
daredd

Registriert seit: 2. Apr 2006
433 Beiträge
 
#13

Re: Problem mit geschlossener Datenmenge!

  Alt 10. Jun 2009, 15:52
Ok, ich probier das mal mit den TIBCQuerries! Aber wieso werden dann überhaupt IBCTables angeboten, wenn es sowieso nicht richtig funktioniert bzw. sehr schlecht.
---------------------------------------------------------------------------
Mein Vista-Kind bringt frischen Wind

Gruß DaRedd aka The Red Dragon
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#14

Re: Problem mit geschlossener Datenmenge!

  Alt 10. Jun 2009, 16:44
Also ich weiss nicht, an der Funktion ist doch Einiges nicht richtig.
Hier mal meine Version:
Delphi-Quellcode:
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;
Sollte die Tabelle geschlossen sein, dann ist State = dsInactive.
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von rwachtel
rwachtel

Registriert seit: 26. Aug 2004
Ort: Köln
530 Beiträge
 
RAD-Studio 2010 Pro
 
#15

Re: Problem mit geschlossener Datenmenge!

  Alt 10. Jun 2009, 18:04
Noch schöner wäre es, auf das with zu verzichten.
Robert Wachtel
  Mit Zitat antworten Zitat
daredd

Registriert seit: 2. Apr 2006
433 Beiträge
 
#16

Re: Problem mit geschlossener Datenmenge!

  Alt 10. Jun 2009, 18:30
Alles klar ich probier das mal aus direkt mit Post und dann Commit
---------------------------------------------------------------------------
Mein Vista-Kind bringt frischen Wind

Gruß DaRedd aka The Red Dragon
  Mit Zitat antworten Zitat
daredd

Registriert seit: 2. Apr 2006
433 Beiträge
 
#17

Re: Problem mit geschlossener Datenmenge!

  Alt 10. Jun 2009, 18:33
Ü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!
---------------------------------------------------------------------------
Mein Vista-Kind bringt frischen Wind

Gruß DaRedd aka The Red Dragon
  Mit Zitat antworten Zitat
daredd

Registriert seit: 2. Apr 2006
433 Beiträge
 
#18

Re: Problem mit geschlossener Datenmenge!

  Alt 10. Jun 2009, 19:04
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
---------------------------
---------------------------------------------------------------------------
Mein Vista-Kind bringt frischen Wind

Gruß DaRedd aka The Red Dragon
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#19

Re: Problem mit geschlossener Datenmenge!

  Alt 10. Jun 2009, 19:25
Hallo,

Zitat:
Das kommt an der Stelle wo ich ein TIBCQuery.Open; mache.
ich weiss es, ich weiss es !!!
Hm, doch nicht.
Wie sollen wir dir ohne Quellcode helfen ?

Machst du vielleicht ein Insert oder Update ?
Dann kein Open, sondern ExecSQL .


Heiko
Heiko
  Mit Zitat antworten Zitat
daredd

Registriert seit: 2. Apr 2006
433 Beiträge
 
#20

Re: Problem mit geschlossener Datenmenge!

  Alt 10. Jun 2009, 19:35
Delphi-Quellcode:
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 .........
@hoika:

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?
---------------------------------------------------------------------------
Mein Vista-Kind bringt frischen Wind

Gruß DaRedd aka The Red Dragon
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 14:59 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