AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TADOQuery Daten manuell updaten
Thema durchsuchen
Ansicht
Themen-Optionen

TADOQuery Daten manuell updaten

Ein Thema von menten · begonnen am 14. Jul 2017 · letzter Beitrag vom 27. Jul 2017
Antwort Antwort
Seite 1 von 2  1 2      
menten

Registriert seit: 3. Apr 2009
41 Beiträge
 
Delphi 10.3 Rio
 
#1

TADOQuery Daten manuell updaten

  Alt 14. Jul 2017, 12:13
Datenbank: MSSQL • Version: 2014 • Zugriff über: ADO
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
Stefan
  Mit Zitat antworten Zitat
jobo

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

AW: TADOQuery Daten manuell updaten

  Alt 14. Jul 2017, 13:33
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: TADOQuery Daten manuell updaten

  Alt 14. Jul 2017, 22:21
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

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

AW: TADOQuery Daten manuell updaten

  Alt 15. Jul 2017, 11:22
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.
Gruß, Jo
  Mit Zitat antworten Zitat
menten

Registriert seit: 3. Apr 2009
41 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TADOQuery Daten manuell updaten

  Alt 23. Jul 2017, 22:12
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
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: TADOQuery Daten manuell updaten

  Alt 23. Jul 2017, 22:42
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: TADOQuery Daten manuell updaten

  Alt 23. Jul 2017, 23:03
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
  Mit Zitat antworten Zitat
menten

Registriert seit: 3. Apr 2009
41 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: TADOQuery Daten manuell updaten

  Alt 24. Jul 2017, 15:13
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
Stefan
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: TADOQuery Daten manuell updaten

  Alt 24. Jul 2017, 15:42
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.
  Mit Zitat antworten Zitat
menten

Registriert seit: 3. Apr 2009
41 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: TADOQuery Daten manuell updaten

  Alt 24. Jul 2017, 16:54
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
Stefan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 20:51 Uhr.
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