AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi FireDAC Merkwürdigkeiten
Thema durchsuchen
Ansicht
Themen-Optionen

FireDAC Merkwürdigkeiten

Ein Thema von haentschman · begonnen am 21. Mai 2021 · letzter Beitrag vom 26. Mai 2021
Antwort Antwort
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#1

AW: FireDAC Merkwürdigkeiten

  Alt 22. Mai 2021, 18:43
Soll es so sein, dass nur auf DSBrowse (und kein anderer State) geprüft wird?
Und wenn schon kein anderer State in Frage kommt, dann keine Fehlerbehandlung wenn die erwarteten nicht vorliegen? (Dann wird die Speicherroutine einfach so beendet, ohne das getan zu haben, was sie soll?)
Das Locate ist eine Funktion, ob es geklappt hat oder gerade die Connection flöten geht oder was anderes, interessiert die nachfolgende Operation auch nicht. Es wird also vielleicht woanders eingetragen, was zu der nicht gefundenen ID gehört.
Wenn man tatsächlich instabile DB Connection hat, könnte das zu unerwarteten Ergebnissen führen. Vielleicht sogar mit stabiler Connection.
Gruß, Jo
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.578 Beiträge
 
Delphi 7 Professional
 
#2

AW: FireDAC Merkwürdigkeiten

  Alt 22. Mai 2021, 18:54
Sagen wir mal so: Die Routine ist verbesserungswürdig:
Delphi-Quellcode:
procedure TDM.FillLastEmployee(ID: Integer; Employee, TerminDate: string);
begin
  // Suche den Satz mit der ID
  FDQuery.Locate('idBelKopf', ID, []); // Gefunden = true, nicht gefunden = false.
  // Aber das interessiert uns nicht.
  // Sind wir im Browsemodus, dann
  if FDQuery.State = dsBrowse then
  begin
    // wird der Satz geändert, auf dem wir gerade mit dem Datensatzzeiger stehen.
    // Es kann der Satz mit idBelKopf = ID sein, muss es aber nicht.
    FDQuery.Edit;
    FDQuery.FieldByName('Monteur').AsString := Employee;
    FDQuery.FieldByName('MonPlan').AsString := TerminDate;
    try
      FDQuery.Post; // <- Zeile 4034
    on e : exception do begin
      FDQuery.Cancel;
      // Und hier dann eine anwenderfreundliche Fehlerbehandlung oder Fehlermeldung ausgeben.
    end;
  end;
end;

Geändert von Delphi.Narium (23. Mai 2021 um 10:09 Uhr) Grund: Schreibfehler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.731 Beiträge
 
Delphi 12 Athens
 
#3

AW: FireDAC Merkwürdigkeiten

  Alt 22. Mai 2021, 22:21
Das Locate erzwingt immer den Browse-Mode (zumindest bei FireDAC). Wenn das Locate keinen anderen Zweck erfüllt, kannst du auch gleich CheckBrowseMode aufrufen und die Prüfung auf Browse-Mode weglassen.

Welcher Datensatz dann geändert wird (und es wird immer einer geändert, wenn keine Exception oder ähnliches auftritt) hängt vom Rückgabewert von Locate ab. Entweder ist es der Datensatz, der gesucht wurde oder der Datensatz der vor dem Locate aktiv war.

Man sollte noch erwähnen, dass bei einem leeren DataSet das Edit intern ein Insert ausführt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: FireDAC Merkwürdigkeiten

  Alt 23. Mai 2021, 12:49
Die Problematik scheint ja vielleicht in der instabilen Connection zu liegen und dann ist das was 100x funktioniert eben nicht in jedem Fall geeignet.

Dank Outsourcing hat man ja heute wohl häufiger mit entfernten DB zu tun, die über VPN Tunnel o.ä. angesprochen werden. Hier geht es dann los mit Latenzen und der "kleinteiligen" Kommunikation, die offenbar eher für's LAN gemacht/geeignet ist.

Delphi.Narium hat ja schon ähnliche Fragen in den Code kommentiert. Ich bin lange nicht mehr auf dem aktuellen Stand bei Delphi, aber würde bspw. unter den genannten Umständen auch die verlässliche Funktion eines Dataset.edit in Frage stellen. Das bräuchte dann u.U. auch schon ein Exception Handling, ich vermute zumindest, dass dahinter die Datenbanksperren geregelt werden.
Unabhängig von der Stabilität der Verbindung oder möglichen anderen Problemen, scheint mir das Ignorieren der Locate Rückgabe suboptimal zu sein.

Und wenn aus dem Update (Edit) ein Insert wird, weil gar nichts da ist, muss das ja auch noch lange nicht funktionieren, wenn die restlichen Felder (hier sind es ja nur 2 Nutzdaten) nicht den DB Regeln entsprechen. Dann scheitert es mindestens an der Relationslogik oder aber an DB Constraints (sofern vorhanden).
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.457 Beiträge
 
Delphi 12 Athens
 
#5

AW: FireDAC Merkwürdigkeiten

  Alt 24. Mai 2021, 07:54
Moin...

Interessant, das man Probleme findet, die so niemals in den Kopf kamen...
Zitat:
Soll es so sein, dass nur auf DSBrowse (und kein anderer State) geprüft wird?
Zitat:
scheint mir das Ignorieren der Locate Rückgabe suboptimal zu sein
Zitat:
Für eine stabile Netzwerkverbindung sorgen.
Zitat:
Dann scheitert es mindestens an der Relationslogik oder aber an DB Constraints
...die Zeilen stammen aus der alten Codebasis. Ich konnte mich leider noch nicht darum kümmern. Das sieht man an dem vorhandenem Locate.
Unabhängig davon ist mir ehrlich gesagt das mit der nicht behandelten Funktionsrückgabe nicht aufgefallen... Es wird später alles auf Objekte und SQL umgebaut. Dann habe ich andere Probleme...

Ihr braucht nicht mehr die Ursache finden...es gibt wichtigere Baustellen.

Danke.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: FireDAC Merkwürdigkeiten

  Alt 24. Mai 2021, 14:54
Ich finde jetzt Locate nicht so schlimm, richtig angewendet. Heute würde ich es nicht mehr nutzen, aber hab ich mal, vor 20 Jahren. Das ist ja eigentlich eine der guten Seiten an Delphi, seine Kompatibilität/Beständigkeit.
Du gehst ja mit deinem eigenen Objekt und Storage Layer andere Wege, geht halt auch.
Aber es geht für mich an den mächtigen DB Features von Delphi vorbei. Alles da, was man braucht.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.457 Beiträge
 
Delphi 12 Athens
 
#7

AW: FireDAC Merkwürdigkeiten

  Alt 25. Mai 2021, 07:56
Moin...
Zitat:
Ich finde jetzt Locate nicht so schlimm
Mit MSSQL hatte schon mehrfach meine Probleme. Sowohl in der alten Firma als auch jetzt. Das Locate kam False zurück obwohl der Datensatz definitiv vorhanden war.
Deshalb schmeiße ich die raus...
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
631 Beiträge
 
Delphi XE6 Enterprise
 
#8

AW: FireDAC Merkwürdigkeiten

  Alt 26. Mai 2021, 08:55
Ich finde jetzt Locate nicht so schlimm, richtig angewendet. Heute würde ich es nicht mehr nutzen, aber hab ich mal, vor 20 Jahren. Das ist ja eigentlich eine der guten Seiten an Delphi, seine Kompatibilität/Beständigkeit.
Eine ständig offene Query, in der man per Locate, Edit und Post rumhampelt, hat schon was von TTable...

Ich würde so ein Konstrukt einfach durch eine UPDATE Anweisung ersetzen oder noch besser einen SP-Aufruf, der die eigentliche Datenbankstruktur verbirgt.
  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 14:50 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-2025 by Thomas Breitkreuz