![]() |
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:
Tausende Male funktionierts und irgendwann kommt irgendeine Fehlermeldung - jetzt z.B. diese hier:
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; 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: |
Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
Wo werden deine TIBTransaction freigegeben?
Evtl. hast du einfach keine Ressourcen mehr zur verfügung! |
Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
Zitat:
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; |
Re: Firbird - Abfrage - Tausend mal funktioniert und beim...
Warum eigene Transaktion für jedes DataSet?
|
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: |
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. |
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: |
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 |
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