Bei mir im Schrank steht noch die Box mit Delphi 1. Schon damals war mir klar, dass Delphi für die Entwicklung von Datenbankanwendungen (wie) geschaffen war. Knapp 30 Jahre später, sieht das schon anders aus.
Meine Datenbankanwendungen arbeiten alle mit
ADO-Verbindungen und greifen weitestgehend auf Microsoft
SQL Server im lokalen Netzwerk zu. FireDAC habe ich nie benutzt, da ich i.V.m. mit
VCL-Anwendungen keine Vorteile sehe und auch nicht bereit bin, für die Entwicklung reiner Client-Anwendungen eine Delphi Enterprise Lizenz zu bezahlen (das soll hier auch nicht das Thema sein).
Unter Verwendung neuerer
OLE-
DB-Provider z.B. „Microsoft-
OLE DB-Treiber 19 für
SQL Server“ i.V.m.
SQL-Servern ab Version 2016 können viele Datensatzänderungen nicht mehr mit IrgendeinDataSet.Post gespeichert werden. Es wird öfters, jedoch nicht immer folgender Fehler ausgegeben:
„Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf. geändert.“
Das passiert vermehrt, wenn ein DateTime-Feld in der Datenbank Millisekunden enthält, die Delphi möglicherweise ignoriert. Beim Speichern des Datensatzes wird dann wahrscheinlich ein abweichender Wert gefunden und führt zu diesem Fehler. Möglicherweise haben ja die alten
OLE-
DB-Provider auch keine Millisekunden geliefert, so dass dieses Problem früher nicht bestand.
Jetzt könnte ich natürlich einfach weiter die alten
OLE-
DB-Provider benutzen; aber:
- Microsoft entwickelt diese seit zig Jahren nicht mehr weiter; möglicherweise funktionieren diese nicht mehr mit der nächsten
SQL-Server-Generation
- Die neuen
OLE-
DB-Provider haben auch Vorteile. Z.B. werden damit in Delphi auch reine Datumsfelder TDateField unterstützt, die bei den alten Providern immer als TStringField ausgegeben wurden.
Um eine Lösung für das Problem herbeizuführen, habe ich meinen einzigen Gratis-Support-Fall für dieses Jahr eingesetzt und folgende Antwort (verkürzt und übersetzt) erhalten:
Wir haben dieses Problem auch mit FireDAC gehabt, mit Datenbanken mit einem Kompatibilitätslevel >= 130. Der FireDAC-Entwickler sagt, dass er nichts tun kann.
Lösungsvorschlag:
http://www.delphigroups.info/2/63/218724.html
Das bedeutet jedoch, dass zwischenzeitliche Datensatzänderungen anderer Anwender einfach überschrieben werden.
Meine Firma habe ich jetzt seit über 20 Jahren. In dieser Zeit musste ich noch nie einem Kunden sagen, das man da nichts machen kann. Klar, manchmal ist es aufwändig, manchmal teuer, manchmal fehlt auch gerade die Zeit. Aber, dass man gar nichts machen kann….
Wie soll es mit Delphi weiter gehen, wenn Probleme auf diese Art gelöst bzw. einfach nur umgangen werden?
Für alle, die sich das Problem mal anssehen wollen, anbei eine schnell zusammen geklöppelte Beispielanwendung.