Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism Firebird - Abfrage - Tausend mal funktioniert und beim... (https://www.delphipraxis.net/119876-firebird-abfrage-tausend-mal-funktioniert-und-beim.html)

spacewolf 2. Sep 2008 16:38

Datenbank: Firebird • Version: 2.04 • Zugriff über: IBX / TIBDATASET

Firebird - Abfrage - Tausend mal funktioniert und beim...
 
Hallo Leute über die folgende Funktion wird die Datenbank abgefragt:

Delphi-Quellcode:
function daOpenDataSet_(ADB: TIBDatabase; const ATableName: String;
  const AFieldNames: Array of String; const ACondition: String): TIBDataSet;
var
  ibTr: TIBTransaction;
  s: String;
  p: Pointer;
begin
  p := nil;
  Result := nil;
  try
    if ATableName = '' then
      raise EDaDBError.Create(SDBENoTableName);
    if Length(AFieldNames) = 0 then
      raise EDaDBError.Create(SDBENoFieldName);
//    if ACondition = '' then
//      raise EDaDBError.Create(SDBENoCondition);
    Result := TIBDataSet.Create(nil);
    ibTr := TIBTransaction.Create(Result);
    ibTr.DefaultAction := TARollback;
    ibTr.Params.Add(konDBReadOnlyTran);
    ibTr.DefaultDatabase := ADB;
    Result.Transaction := ibTr;

    ibTr.StartTransaction;
    if ACondition <> '' then
      Result.SelectSQL.Text := Format('SELECT %s FROM %s WHERE %s',
        [daArrayToString(AFieldNames), ATableName, ACondition])
    else
      Result.SelectSQL.Text := Format('SELECT %s FROM %s',
        [daArrayToString(AFieldNames), ATableName]);

    Result.Open;
//Muss Caller handeln       ibdsFields.Transaction.Rollback;
  except
    on e:Exception do begin
      p := AcquireExceptionObject;
      s := '';
      try
        if (ADB <> nil) then
          s := ADB.DatabaseName;
      except end;
      e.Message := 'daDb.daOpenDataSet' +
                   SDBEErrRead+#13#10#09 +
                   SDBDataBase+': '+s+#13#10#09+
                   SDBTable+': '+ATableName+#13#10#09+
                   SDBField+': '+daArrayToString(AFieldNames)+#13#10#09+
                   SDBCondition+': '+ACondition+#13#10#09+
                   SPMErrMsg+': '+e.Message+#13#10#09+
                   SPMErrCls+': '+e.ClassName+#13#10#09;
    end;//on e:Exception do begin
  end;
  if p <> nil then begin
    raise EDaDBError(p);
  end;
end;
Tausende Male funktionierts und irgendwann kommt irgendeine Fehlermeldung - jetzt z.B. diese hier:
EAccessViolation / Zugriffsverletzung bei Adresse 10024CC6 in Modul 'gd32.dll'. Lesen von Adresse 00000008.

:wall: :wall: :wall: :wall:

Ich habe keine Ahnung warums da kracht. Kann mir da jemand einen TIP geben?

Shalom

der Andreas :sharkylinchen:

Bernhard Geyer 2. Sep 2008 16:42

Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
 
Wo werden deine TIBTransaction freigegeben?
Evtl. hast du einfach keine Ressourcen mehr zur verfügung!

Meta777 2. Sep 2008 21:47

Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
 
Zitat:

Zitat von Bernhard Geyer
Wo werden deine TIBTransaction freigegeben?
Evtl. hast du einfach keine Ressourcen mehr zur verfügung!

hi.

funtion ist auf meinen Mist gewachsen.
Die Funktion gibt ein TIBDatast zurück über das die Transaction rollbacked und gefreet wird - soltle jedenfalls so sein, es sei den es wurde vergessen...
Delphi-Quellcode:
  with daOpenDataset() do
  try
    blahblahblub
  finally
    //hier transaction zurückrollen - ist ja immer nen select
    Transaction.Rollback;
    //Das zurückgegebene TIbDataset freen - da Transaction das dataset als Owner hat wird die transaction auch gefreet
    Free;
  end;

mkinzler 2. Sep 2008 21:54

Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
 
Warum eigene Transaktion für jedes DataSet?

spacewolf 3. Sep 2008 01:25

Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
 
Warum nicht? - Wenn ich eine Anfrage brauche - erzeuge ich das Transaction - Object und wenn ich sie nicht mehr brauche - wieder gefreet so ists denke ich am saubersten?!?! :?:

hab gelesen das jemand anderes einfach datenbank abbaut und wieder aufbaut... sehr gewagt... aber er meint dadurch merken seine kunden die probleme nicht... *grübel* - vllt. sollten wir das zwischendurch mal tun im thread...

achja - das ganz läuft in einem Thread ab - ist als Multithreaded!!!

der Andreas :sharkylinchen:

omata 3. Sep 2008 01:35

Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
 
Arbeitest du mit der Embedded-Version oder mit einer Servervariante?

Greifst du in verschiedenen Threads parallel auf die Datenbank zu?

Eventuell must du mal Kritische Abschnitte einführen.

spacewolf 3. Sep 2008 11:26

Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
 
Wir arbeiten mit der normalen Servervariante.

>>Greifst du in verschiedenen Threads parallel auf die Datenbank zu?
Jup! - Aber jeder Thread hat seine eigene Datenbankverbindung offen. :stupid:

>>Eventuell must du mal Kritische Abschnitte einführen.
Critical Sections? Ist doch nur zum Synchronisieren gut oder ?

der Andreas :sharkylinchen:

spacewolf 3. Sep 2008 11:58

Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
 
hab grad mal die Connections angschaut - seit heute morgen (nach kompletten neustart - sind seit heute morgen alleine 40 Connections von diesem Computer auf sich selbst auf port 3050) offen. Kann es sein das der Firebirdclient nur eine gewisse maximale Anzahl an Conncetions kann?

der Andreas

mkinzler 3. Sep 2008 11:59

Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
 
Es scheint eher der Fall dass die Transaktionen nicht richtig geschlossen werden.


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