Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TADOQuery Daten manuell updaten (https://www.delphipraxis.net/193309-tadoquery-daten-manuell-updaten.html)

menten 14. Jul 2017 11:13

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

TADOQuery Daten manuell updaten
 
Hallo zusammen,

ich muss hier mal ein Frage loswerden und hoffe das sie nicht ganz daneben ist.

Es geht um die standardmäßig mit Delphi gelieferten ADO-Komponenten. Wenn ich damit z.B. mit TADOQuery in einer SQL-Datenbank eine Sicht abfrage, kann ich Änderungen natürlich nicht speichern. Zu BDE-Zeiten gab es dafür ein "UpdateObject" wo man dann individuelle Update bzw. Insert Statements verwenden konnte. Das gibt es bei den ADO-Konponenten nicht. Ich habe schon mehrfach nach einer Lösung dazu gesucht, lande aber immer bei der Verwendung von Fremdkomponenten. Im Moment benutze ich Adonis von WINSOFT. Die kann man aber nicht parallel zu den normalen ADO-Komponenten betreiben was immer wieder zu Problemen führt. Auch weil Delphi (XE7, 10.2) offensichtlich Schwierigkeiten hat, die Einstellungen zu verwalten. Ständig werden die Standard ADO-Komponenten geladen obwohl sie eigentlich deaktiviert sind.

Gibt es mit den Standard ADO-Komponenten eine Möglichkeit, das Speichern abzufangen und manuell durchzuführen?

Danke und Gruß
Stefan Menten

jobo 14. Jul 2017 12:33

AW: TADOQuery Daten manuell updaten
 
Also erstmal:
Man kann Views updaten. Das hat weniger mit der (ADO)Komponente zu tun, als mit dem Aufbau des Views.
Der View muss z.B. auf jeden Fall das PK Feld beinhalten. Wie weit das geht ist von den Fähigkeiten des DB Servers abhängig.
Notfalls (wenn View direkt Update gewünscht) das Verfahren bzw. die Update Fähigkeit des Views zu Fuß in der SQL Konsole ausprobieren.

Ansonsten kannst Du ohne weiteres mit einer zusätzlichen Adoquery das Update selber zusammenbauen und auslösen. Aufhänger wäre vermutlich das BeforePost des darstellenenden Queries.

p80286 14. Jul 2017 21:21

AW: TADOQuery Daten manuell updaten
 
Grundsätzlich halte ich sehr wenig von solch "intelligenten" Komponenten, da das "one fits all" im allgemeinen dann versagt wenn man es nicht erwartet, bzw. wenn man es am wenigsten gebrauchen kann. darum erstelle ich die notwendigen Insert/Updatestatements immer selber. Das ist zwar etwas aufwendiger, aber Du hast dann alles unter Kontrolle.

Gruß
K-H

jobo 15. Jul 2017 10:22

AW: TADOQuery Daten manuell updaten
 
Ja, da hast Du nicht Unrecht.
Aber einen View in eine ADOQuery zu kippen statt einer Table ist ja erstmal legitim und eben machbar.
Ist der View dann nicht geeignet für ein Update/Insert, kann man immer noch nachlegen und den "Zusatzaufwand" betreiben.
Entweder durch manuell erstelle Insert/Update Queries nebenher wie Du vorgeschlagen hast oder durch etwas "feilen" am Aufbau des Views.
Genauer: Auch das Update einer berechneten Spalte im aktualisierbaren View wird natürlich fehlschlagen, da kann der Viewaufbau dann nichts dafür. Hier reicht es ggF schon, die berechnete Spalte readonly zu setzen.

menten 23. Jul 2017 21:12

AW: TADOQuery Daten manuell updaten
 
Hallo zusammen,

erst mal danke für die Antworten. Ich scheine aber mit meiner Frage nicht richtig verstanden worden zu sein. Natürlich kann ich auch eine View so aufbauen, dass man sie updaten kann. Aber spätestens wenn die Sicht aus mehreren Tabellen besteht oder eine Stored Procedure die Daten liefert, ist das ja vorbei. Man könnte natürlich auch mit Triggern arbeiten, das ist aber sehr aufwändig.

Mit geht es um das Ergeignis, welches ich abfragen kann, um das Speichern selbst übernehmen zu können. BeforePost fällt aus, weil man den Vorgang nicht kontrollieren kann. Man könnte den nur mit "Abort" abbrechen oder mit einer Exception unterbrechen. Ansonsten würde der Vorgang fortgesetzt obwohl wir ihn ja schon abgearbeitet hätten.

Ein wie auch immer geartetes Update-Ereignis würde die Information mitbringen, ob Insert, Update oder Delete ausgeführt werden soll und hätte die Möglichkeit den Vorgang als Applied abzuschließen. So haben das die alten BDE-Komponenten gemacht und so macht es auch ADONIS. Allerdings mit dem Problem, das die nicht parallel zu den Standard-ADO installiert sein können.

Danke und Gruß
Stefan Menten

p80286 23. Jul 2017 21:42

AW: TADOQuery Daten manuell updaten
 
Zitat:

Zitat von menten (Beitrag 1376703)
Es geht um die standardmäßig mit Delphi gelieferten ADO-Komponenten. Wenn ich damit z.B. mit TADOQuery in einer SQL-Datenbank eine Sicht abfrage, kann ich Änderungen natürlich nicht speichern.......

Gibt es mit den Standard ADO-Komponenten eine Möglichkeit, das Speichern abzufangen und manuell durchzuführen?

Wie Du schon richtig festgestellt hast, gibt es bei der ADO-Query keine "automatische" Specherung. Du mußt diese immer von Hand als Insert oder Update-Statement absetzen. Es ist somit auch nicht nötig ein Event "abzufangen".

Die Adonis-Komponenten können natürlich andere Eigenschaften haben. Aber das wäre dann eine andere Baustelle.

Gruß
K-H

nahpets 23. Jul 2017 22:03

AW: TADOQuery Daten manuell updaten
 
BDE und ADO funktionieren (zumindest bis Delphi 7) problemlos nebeneinander, auch innerhalb eines Programmes.

Ob's sinnvoll ist, steht auf 'nem anderen Blatt.

Wäre eventuell das Ereignis OnWillChangeRecord der TADOQuery das von Dir gesuchte Ereignis?

http://www.delphigroups.info/2/3/304406.html
http://docwiki.embarcadero.com/Libra...llChangeRecord

menten 24. Jul 2017 14:13

AW: TADOQuery Daten manuell updaten
 
Hallo nahpets,

BDE hatte ich nur als Beispiel für die Routine genannt, wollte ich nicht wieder mit anfangen.

Aber OnWillChangeRecord könnte funktionieren, muss ich mal ausprobieren. Schon mal so gearbeitet?

Gruß
Stefan

nahpets 24. Jul 2017 14:42

AW: TADOQuery Daten manuell updaten
 
Nein, noch nicht probiert, aber die Beschreibung klingt so, als könnte man sich da einklinken, die Änderungen machen und dann das von der TADOQuery vorgesehene Speichern abbrechen.

Probleme dürfte man dann (eigentlich?) nur mit datensensitiven Komponenten bekommen, da die von den Änderungen nichts erfahren.

Mit 'nem TADOQuery.Refresh dürfte das Problem aber auch zu lösen sein, sofern man überhaupt datensensitiven Komponenten nutzt.

menten 24. Jul 2017 15:54

AW: TADOQuery Daten manuell updaten
 
Ich hab das jetzt mal ausprobiert.

OnWillChangeRecord und OnRecordChangeComplete wird aufgerufen, bevor das eigentliche Speichern in der Datenbank passiert. In beiden Ereignissen kann man das Speichern erledigen. Aber der Ablauf wird nicht unterbrochen und man bekommt im Anschluss die Fehlermeldung, dass nicht genug Schlüsselinformationen zum Aktualisieren vorhanden sind.

OnWillChangeRecordset und OnRecordsetChangeComplete werden offensichtlich nach dem Speichern in der Datenbank aufgerufen. Da kommt besagte Fehlermeldung nämlich bevor man in den Ereignissen landet.

Sieht für mich so aus, als hätte man hier nur die ursprüngliche ADO Schnittstelle implementiert und alles 1:1 übernommen ohne sich groß Gedanken zu machen.

Wenn man keine datensensitiven Komponenten benutzt, hat man das Problem sicher nicht. Das steht für mich aus Effektivitätsgründen aber nicht zur Debatte.


Gruß
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 Uhr.
Seite 1 von 2  1 2      

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