Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ADO - Refresh-Problem oder so (https://www.delphipraxis.net/151974-ado-refresh-problem-oder-so.html)

Rainer Wolff 8. Jun 2010 10:19

Datenbank: Access • Version: 2003 • Zugriff über: ADO

ADO - Refresh-Problem oder so
 
Hallo,

ich habe eine Delete-Query, die jede Stunde einmal Datensätze aus einer Tabelle löscht, die älter als 4 Tage sind, und die ein Flag gesetzt haben.

Jetzt kommt regelmäßig die beim Aufruf die Fehlermeldung:

Exception class: EOleException
Exception message: Datensatz ist gelöscht.

Der Quellcode ist eigentlich so simpel, dass nicht viel Fehler drin sein kann:

Delphi-Quellcode:
procedure TdmProdProtokollBasis.tmr1Timer(Sender: TObject);
const
  DaysToKeep=4;
var
  DelDate:TDateTime;
begin
  query1.SQL.Text:='Delete from tbl_rueckmelden where ControlKey=:wert and Datum<:datum';
  query1.Parameters.ParamByName('wert').Value:=true;
  DelDate:=Date-DaysToKeep;
  query1.Parameters.ParamByName('datum').Value:=DelDate;
  query1.ExecSQL;
end;
Es muss ja irgendwie ein Refresh-Problem sein, aber ich weiss nicht, was für einen Befehl ich versuchen könnte, vor allem, da ich das Problem hier nicht nachvollziehen kann, sondern eben nur der Kunde davon berichtet.

Gruß Rainer

hoika 8. Jun 2010 10:45

AW: ADO - Refresh-Problem oder so
 
Hallo,

hoffentlich benutzt du query1 nicht noch an einer anderen Stelle.
Ich würde hier mal eine eigene Query nehmen, die auch nur hier benutzt wird (lokale Variable).


Heiko

Rainer Wolff 8. Jun 2010 10:58

AW: ADO - Refresh-Problem oder so
 
Zitat:

Zitat von hoika (Beitrag 1026772)
Hallo,

hoffentlich benutzt du query1 nicht noch an einer anderen Stelle.
Ich würde hier mal eine eigene Query nehmen, die auch nur hier benutzt wird (lokale Variable).


Heiko

Doch, genau das mache ich, eine procedure weiter beim einfügen von Datensätzen in selbige Tabelle. Ich werde das mal ändern, aber warum gibts damit Probleme?

Rainer

Rainer Wolff 8. Jun 2010 13:40

AW: ADO - Refresh-Problem oder so
 
Zitat:

Zitat von Rainer Wolff (Beitrag 1026783)
Zitat:

Zitat von hoika (Beitrag 1026772)
Hallo,

hoffentlich benutzt du query1 nicht noch an einer anderen Stelle.
Ich würde hier mal eine eigene Query nehmen, die auch nur hier benutzt wird (lokale Variable).


Heiko

Doch, genau das mache ich, eine procedure weiter beim einfügen von Datensätzen in selbige Tabelle. Ich werde das mal ändern, aber warum gibts damit Probleme?

Rainer

Das war aber auch nicht die Lösung des Problems. Ich habe eine separate Query fürs Löschen eingebaut, der Fehler kommt aber wieder.

Bernhard Geyer 8. Jun 2010 13:46

AW: ADO - Refresh-Problem oder so
 
Kannst du zwischendurch mal die Connection zu machen und wieder öffnen? Evtl. mal den Cache der JET-Engine leeren wie hier beschrieben.

Access/JET ist hier teilweise eine Schrottimplementierung die bei externen Zugriff über ADO probleme bereitet.

Rainer Wolff 14. Jun 2010 14:33

AW: ADO - Refresh-Problem oder so
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1026897)
Kannst du zwischendurch mal die Connection zu machen und wieder öffnen? Evtl. mal den Cache der JET-Engine leeren wie hier beschrieben.

Access/JET ist hier teilweise eine Schrottimplementierung die bei externen Zugriff über ADO probleme bereitet.

Thread mal wieder nach oben schubs....

Auch dieses habe ich inzwischen erfolglos probiert:

Delphi-Quellcode:
  query2.SQL.Text:='Delete from tbl_rueckmelden where ControlKey=:wert and Datum<:datum';
  query2.Parameters.ParamByName('wert').Value:=true;
  DelDate:=Date-DaysToKeep;
  query2.Parameters.ParamByName('datum').Value:=DelDate;
  query2.ExecSQL;
  FlushCache;
end;

procedure TdmProdProtokollBasis.FlushCache;
var
  aJet : IJetEngine;
  aConn : _Connection;
begin
//  ADOConnection1.Connected := True;
  aJet := CoJetEngine.Create;
  aConn := ADODB_TLB._Connection(Connection.ConnectionObject);
  aJet.RefreshCache(ADODB_TLB._Connection(aConn));

shmia 14. Jun 2010 18:51

AW: ADO - Refresh-Problem oder so
 
Hast du überall die CursorLocation auf clUseServer stehen?
Falls nicht, führt dies zu einem "Double-Buffering" Effekt.

Hast du nur ein einziges Connection-Objekt am Start?
Falls nicht gibt das bei der Jet-Engine seltsame Effekte:
Connection A bemerkt Veränderungen an der DB, die über Connection B gemacht wurden erst nach mehr als 5 Sekunden (~Cache-Timeout).


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