Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ADO Connection Timeout (https://www.delphipraxis.net/208949-ado-connection-timeout.html)

fabi17 4. Okt 2021 10:42

Datenbank: MSSQL • Version: 14 • Zugriff über: ADO

ADO Connection Timeout
 
Tag zusammen,

ich habe eine Stringlist mit Belegnummern, die ich in einer Schleife nachberechne.
Die Prozedur zur Nachberechnung ist ganz klein und es sind auch nicht viele Records, dennoch läuft meine ADO Connection in einen Timout, aber nur beim letzten Eintrag der Stringlist (der ist auch nicht null).
Die Prozedur geht ungefähr so:

Delphi-Quellcode:
with ADO do
    begin
      Close;
      Sql.Clear;
      Sql.Add('select SUM(GesamtPreis) AS GesamtPreis FROM BelegP WHERE Belegnummer =:P1 AND (Status = 0 OR Status = NULL) AND Steuersatz = :P2 AND Kennzeichen =:P3');
      Parameters.ParamByName('P1').Value := Belegnummer;
      Parameters.ParamByName('P2').Value := MainMenu.Steuer1;
      Parameters.ParamByName('P3').Value := '0';
      Open;

      result := IfNull(FieldByName('GesamtPreis').Value, 0);
    end;
An der Timeout Zeit kann es nicht liegen. Den RecordCount kann ich auch nicht abfragen, da bei SUM ja immer eine Zeile zurückgegeben wird. Hat jemand eine Idee, wieso es zum Timeout kommt? Für mich macht es keinen Sinn, da es auch nur beim letzten Eintrag passiert und davor durchläuft. Es handelt sich um einen MSSQL Server (lokal) mit Windows Server 2019.

Danke vorab für jede Hilfe

Viele Grüße

Jasocul 4. Okt 2021 11:00

AW: ADO Connection Timeout
 
Also den Recordcount kannst du natürlich indirekt ermitteln, indem du ein count(*) in die Abfrage mit einbaust.

Hast du die Abfrage schonmal direkt auf der Datenbank für den letzten Eintrag ausprobiert?

fabi17 4. Okt 2021 11:07

AW: ADO Connection Timeout
 
Hi,

er läuft auch auf Fehler, wenn er Records hat. Ich habe die Abfrage manuell gemacht und er liefert auch einen Wert zurück.

Delphi.Narium 4. Okt 2021 12:39

AW: ADO Connection Timeout
 
Dashier geht unter SQL normalerweise nicht:
SQL-Code:
Status = NULL

In allen mir bekannten SQL-Varianten heißt das
SQL-Code:
Status is NULL
.

Mich irritiert das with, hab' das mal umgeschrieben, so in der Art, wie es bei mir vermutlich aussehen würde (aber ungetestet):
Delphi-Quellcode:
function GetGesamtpreis(ADO : TADOQuery; Belegnummer : String; Steuer1 : Integer) : Currency;
begin
  // Statt .Value lieber den korrekten Datentyp nehmen - wegen Typsicherheit.
  ADO.Parameters.ParamByName('P1').AsString := Belegnummer;
  ADO.Parameters.ParamByName('P2').AsInteger := Steuer1;
  // Ist das in der DB ein VarChar oder so?
  ADO.Parameters.ParamByName('P3').AsString := '0';
  ADO.Open;
  Result := ADO.Fields[0].AsCurrency;
  ADO.Close;
end;

begin
  ADO.Close;
  ADO.Sql.Clear;
  ADO.Sql.Add('select Sum(IsNull(GesamtPreis,0)) as GesamtPreis from BelegP');
  ADO.Sql.Add('where Belegnummer = :P1');
  ADO.Sql.Add('and (Status = 0 or Status is NULL)');
  ADO.Sql.Add('and Steuersatz = :P2');
  ADO.Sql.Add('and Kennzeichen = :P3');
  // Hier die Schleife:
  for i := 0 to Stringlist.Count - 1 do begin
    // Woimmer jetzt auch Belegnummer herkommt
    irgendeinevariabel := GetGesamtpreis(ADO, Stringliste[i], MainMenu.Steuer1);
  end;
end;
Sinn der parametrisierten Abfrage ist es ja (u. a.), dass das SQL nicht jedesmal neu zusammengebaut werden muss, sondern nur einmalig. Danach werden nur noch die Parameter je Abfrage entsprechend gesetzt.

fabi17 4. Okt 2021 13:11

AW: ADO Connection Timeout
 
danke für dein Feedback. Interessanterweise funktioniert es mit der FireDAC Query problemlos... - das werde ich jetzt so abändern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf