Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit geschlossener Datenmenge! (https://www.delphipraxis.net/135366-problem-mit-geschlossener-datenmenge.html)

daredd 9. Jun 2009 23:24

Datenbank: Firebird • Zugriff über: IBDAC

Problem mit geschlossener Datenmenge!
 
Hallo,

also nach langen hin und her probieren hab ich mich nun entschlossen IBDAC-Komponenten zu benutzen, die kosten zwar aber wenigstens funktionier schon mal die Verbindung zu den Datenbanken und das umstellen von BDE war auch recht unkompliziert dank des BDE/IBX Migration Wizard.


Nun hab ich aber ein Problem mit dem eintragen von Daten in eine Tabelle.
Wenn ich die Operation Commit aufrufe sagt mir der Compiler das die Operation bei geschlossener Datenmenge nicht möglich ist. Und dann findet er gewisse Spalten in der Tabelle nicht.

Kann mir einer sagen wonach ich da überhaupt suchen soll?

Ich meine die Connection zu den Tabellen usw. steht einwandfrei, wieso ist aber die Datenmenge geschlossen? Heißt das die Tablle ist nicht Active oder so?


Delphi-Quellcode:
procedure PostFlush(Table : TIBCTable);
begin
     with Table do begin
          if (State = dsEdit) or (State = dsInsert) then Post;
          if (Connection <> nil) then begin
           if Connection.InTransaction then Connection.Commit;
        end else begin
             Transaction.Commit;
          end;
          Refresh;
   end;
end;
Das ist noch mal der Code, bei Refresh kommt dann dei Fehlermeldung:
Erste Gelegenheit für Exception bei $778B42EB. Exception-Klasse EDatabaseError mit Meldung 'tbPacient: Operation bei geschlossener Datenmenge nicht ausführbar'. Prozess Unknown.exe (3220)

Auch und dannach kommt:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Unknown.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'tbPacient: Das Feld 'Ind' wurde nicht gefunden' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

usw.

mkinzler 9. Jun 2009 23:42

Re: Problem mit geschlossener Datenmenge!
 
Existiert den das Feld Ind?
Nimm aber besser keine Table-Komponente bei richtigen DBMS!

daredd 9. Jun 2009 23:46

Re: Problem mit geschlossener Datenmenge!
 
Na klar exestiert IND!

Aber wie soll ich denn sonst vorgehen wenn nicht mit Table-Komponeten, ist doch einfacher so.

Ich habe jetzt noch am anfang der Procedure
Connection.Open;
Table.Open;
Table.Active := True; gesetzt, trozdem kommen die Fehler.

mkinzler 9. Jun 2009 23:48

Re: Problem mit geschlossener Datenmenge!
 
Aber heisst das Feld auch 'Ind' oder 'ind' oder 'IND'. Da ist ja ein Unterschied

daredd 9. Jun 2009 23:52

Re: Problem mit geschlossener Datenmenge!
 
Also ich habe nun folgendes gemacht:

Delphi-Quellcode:
procedure PostFlush(Table : TIBCTable);
begin
     with Table do begin
          if (State = dsEdit) or (State = dsInsert) then Post;
          if (Connection <> nil) then begin
           if Connection.InTransaction then Connection.Commit;
        end else begin
             Transaction.Commit;
          end;
          Connection.Open;
          Table.Open;
          Table.Active := true;
          Refresh;
   end;
end;
Das funktioniert, aus irgendeinem Grund ist die Datenmenge geschlossen.

Wenn ich nun das Programm laufen lasse, kommt die Fehlermeldung bei der Tabelle tbPacient nicht mehr er geht weiter und bleib dann wieder mit einem 'Ind' nicht gefunden Fehler hängen, diesmal aber an einer anderen Tabelle.


Kann es sein das generell alle Tabellen geschlossen sind oder so?
Schließt das Commit die Datenmenge wieder?

@mkinzler:

Das heist 'Ind'

mkinzler 9. Jun 2009 23:57

Re: Problem mit geschlossener Datenmenge!
 
Versuch es mal Testweise mit eine TIBCQuery. Ist wie gesagt sowieso besser

daredd 10. Jun 2009 00:01

Re: Problem mit geschlossener Datenmenge!
 
Oh ne, weisst du wieviel arbeit das wieder ist alle Tablle (ca. 28) in Queries umzuwandeln. Und dann ständig mit SQL (was ich nicht kann) Tabellen zu bearbeiten.

Gibts da keine bessere Lösung?

mkinzler 10. Jun 2009 00:09

Re: Problem mit geschlossener Datenmenge!
 
TIBCQuery ist nur wegen der Abwärtskompatibilität zur BDE vorhanden aber anders wie dort, basieren die Tables auch auf SQL. D.H. im Hintergrund werden entsprechende Abfragen generiert, diese sind nicht optimal und auch nicht beeinflussbar.
die Anzeige basiert z.B. auf der Abfrage
SQL-Code:
select * from <Tabelle>;
Dies hat mehrere Nachteile:
-es werden alle Felder abgefragt ( das kleiner Problem)
-es werden alle Datensätze angefordert ( ohne Limitierung; kann bei großen Tabellen zum Problem werden)
-es können Probleme bei den Feldnamen auftreten ( bei case-sensitiven Feldern, wie in deinem Fall)

Deshalb keine Tables verwenden und entsprechende Abfragen selber festlegen ( kann durch IDE assistiert angelegt werden)

daredd 10. Jun 2009 00:25

Re: Problem mit geschlossener Datenmenge!
 
Ja aber das ist mir echt alle ein wenig kompliziert, null bock mich da reinzufinden.

Aber das Commit schließt nicht die Tabelle oder?

mkinzler 10. Jun 2009 00:31

Re: Problem mit geschlossener Datenmenge!
 
Zitat:

Aber das Commit schließt nicht die Tabelle oder?
Eigentlich nicht.
Zitat:

Ja aber das ist mir echt alle ein wenig kompliziert, null bock mich da reinzufinden.
Würde ich aber machen. SQL ist nicht schwer und der Vorteil von relationalen Datenbanken erschliessen sich dann erst richtig
Aber für den Anfang sollte der Abfragegenerator der Komponente helfen (Einfach Doppelklick darauf)

Lemmy 10. Jun 2009 07:06

Re: Problem mit geschlossener Datenmenge!
 
Guten Morgen,

Zitat:

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

hoika 10. Jun 2009 08:28

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

daredd 10. Jun 2009 15:52

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.

shmia 10. Jun 2009 16:44

Re: Problem mit geschlossener Datenmenge!
 
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;

rwachtel 10. Jun 2009 18:04

Re: Problem mit geschlossener Datenmenge!
 
Noch schöner wäre es, auf das with zu verzichten.

daredd 10. Jun 2009 18:30

Re: Problem mit geschlossener Datenmenge!
 
Alles klar ich probier das mal aus direkt mit Post und dann Commit

daredd 10. Jun 2009 18:33

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!

daredd 10. Jun 2009 19:04

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
---------------------------

hoika 10. Jun 2009 19:25

Re: Problem mit geschlossener Datenmenge!
 
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

daredd 10. Jun 2009 19:35

Re: Problem mit geschlossener Datenmenge!
 
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?

hoika 10. Jun 2009 19:38

Re: Problem mit geschlossener Datenmenge!
 
Hallo,

so ist es.
Am besten benennst du das Feld um (ibexpert)


Heiko

sx2008 12. Jun 2009 14:15

Re: Problem mit geschlossener Datenmenge!
 
Zitat:

Zitat von daredd
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?

Sehr gut möglich.
Es gibt bestimmte reservierte Wörter, die man einfach nicht benützen sollte.
Und BINGO das Wort "OPEN" ist reserviert: http://www.firebirdsql.org/refdocs/l...rds-added.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 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