AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Prism Firebird - Abfrage - Tausend mal funktioniert und beim...
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird - Abfrage - Tausend mal funktioniert und beim...

Ein Thema von spacewolf · begonnen am 2. Sep 2008 · letzter Beitrag vom 3. Sep 2008
Antwort Antwort
Benutzerbild von spacewolf
spacewolf

Registriert seit: 24. Apr 2003
Ort: Magdeburg
218 Beiträge
 
Delphi 7 Professional
 
#1

Firebird - Abfrage - Tausend mal funktioniert und beim...

  Alt 2. Sep 2008, 16:38
Datenbank: Firebird • Version: 2.04 • Zugriff über: IBX / TIBDATASET
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.



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

Shalom

der Andreas
Andreas Göllner
("`-''-/").___..--''"`-._
`6_ 6 ) `-. ( ).`-.__.`)
"Ich kann Dir nur die Tür zeigen, durchgehen musst Du ganz allein."
Wer ist die Tür? Jesus!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 2. Sep 2008, 16:42
Wo werden deine TIBTransaction freigegeben?
Evtl. hast du einfach keine Ressourcen mehr zur verfügung!
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 2. Sep 2008, 21:47
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 2. Sep 2008, 21:54
Warum eigene Transaktion für jedes DataSet?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von spacewolf
spacewolf

Registriert seit: 24. Apr 2003
Ort: Magdeburg
218 Beiträge
 
Delphi 7 Professional
 
#5

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

  Alt 3. Sep 2008, 01:25
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
Andreas Göllner
("`-''-/").___..--''"`-._
`6_ 6 ) `-. ( ).`-.__.`)
"Ich kann Dir nur die Tür zeigen, durchgehen musst Du ganz allein."
Wer ist die Tür? Jesus!
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 3. Sep 2008, 01:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von spacewolf
spacewolf

Registriert seit: 24. Apr 2003
Ort: Magdeburg
218 Beiträge
 
Delphi 7 Professional
 
#7

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

  Alt 3. Sep 2008, 11:26
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.

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

der Andreas
Andreas Göllner
("`-''-/").___..--''"`-._
`6_ 6 ) `-. ( ).`-.__.`)
"Ich kann Dir nur die Tür zeigen, durchgehen musst Du ganz allein."
Wer ist die Tür? Jesus!
  Mit Zitat antworten Zitat
Benutzerbild von spacewolf
spacewolf

Registriert seit: 24. Apr 2003
Ort: Magdeburg
218 Beiträge
 
Delphi 7 Professional
 
#8

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

  Alt 3. Sep 2008, 11:58
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
Andreas Göllner
("`-''-/").___..--''"`-._
`6_ 6 ) `-. ( ).`-.__.`)
"Ich kann Dir nur die Tür zeigen, durchgehen musst Du ganz allein."
Wer ist die Tür? Jesus!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 3. Sep 2008, 11:59
Es scheint eher der Fall dass die Transaktionen nicht richtig geschlossen werden.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:22 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