![]() |
Datenbank: MSSQL • Version: 2017 • Zugriff über: FireDAC
FireDAC Merkwürdigkeiten
Hallöle...
Wieder was zum Schmunzeln...oder auch nicht. :shock: Wie geht das? Zitat:
Delphi-Quellcode:
procedure TDM.FillLastEmployee(ID: Integer; Employee, TerminDate: string);
begin FDQuery.Locate('idBelKopf', ID, []); if FDQuery.State = dsBrowse then begin FDQuery.Edit; FDQuery.FieldByName('Monteur').AsString := Employee; FDQuery.FieldByName('MonPlan').AsString := TerminDate; FDQuery.Post; // <- Zeile 4034 end; end; |
AW: FireDAC Merkwürdigkeiten
Datenbankverbindung ist ReadOnly, FDQuery ist ReadOnly oder enthält eine nicht editierbare Datenmenge (z. B: eine Select über mehrere Tabellen), ...?
|
AW: FireDAC Merkwürdigkeiten
Zitat:
ReadOnly: False QueryReadOnly: False Join: no Wir haben teilweise richtige Netzwerkprobleme...kann das damit zusammenhängen? |
AW: FireDAC Merkwürdigkeiten
Ja!
Verbindung geht zwischendurch flöten, der Server merkt es und die Datenbank macht ein Rollback. Beim Post gibt es dann eine neue Datenbankverbindung, eine neu Transaktion und das Zusammenspiel passt nicht mehr. Strubbel in beliebiger Kombination ist in so 'nem Fall möglich. |
AW: FireDAC Merkwürdigkeiten
Und wie geht man mit sowas um?
|
AW: FireDAC Merkwürdigkeiten
Für eine stabile Netzwerkverbindung sorgen.
Ggfls. TimeOut-Einstellungen auf beiden Seiten anpassen. Ursachenforschung betreiben: Z. B. per Ping prüfen, wie die Antwortzeiten zwischen Client und Server sind. "Unnormal hoch"? Ursache suchen und beseitigen. Per Traceroute prüfen, ob eventuell ein Problem "irgendwo auf der Strecke zwischen Client und Server" vorliegt. Router und oder Switch zicken rum, sind (halbwegs) defekt, Kabelstecker locker, Wackelkontakt durch Kabelbruch, ... Prüfen, ob es ausschließlich Probleme bei der Kommunikation zwischen Datenbankserver und Datenbankclient sind, oder eher grundsätzliche Probleme vorliegen. Eigentlich gibt es da auf technischer Ebene eine Unmenge an Problemen, die man als Entwickler eher nicht beeinflussen kann. Da müssen dann die entsprechenden Admins und / oder Techniker ran. Im Programm dafür sorgen, dass auch bei solchen Problemen ein konsistenter Datenbestand sichergestellt ist. Reparaturroutinen à la: Klapptnicht, dann einfach nochmal probieren, nur dann, wenn es wirklich keine andere Lösungsmöglichkeit gibt. Aber das ist eher nicht empfehlenswert, insbesondere nicht bei Datenbanken, bei HTTP- oder FTP-Abfragen, lesen von Dateien "irgendwo auf 'nem Netzlaufwerk", ... kann man sowas eventuell machen. |
AW: FireDAC Merkwürdigkeiten
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. |
AW: FireDAC Merkwürdigkeiten
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; |
AW: FireDAC Merkwürdigkeiten
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. |
AW: FireDAC Merkwürdigkeiten
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). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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