Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem beim ADODataSet.Delete (https://www.delphipraxis.net/110151-problem-beim-adodataset-delete.html)

onkelmehli 13. Mär 2008 17:53

Datenbank: SQL Server • Version: 2005 • Zugriff über: ADO

Problem beim ADODataSet.Delete
 
Hallo,

ich hole mir Daten über eine ADODataSet die wiederum auf eine View (Verknüpfung zweier Tabellen) zugreift.
In dieser View habe ich einen Instead of Delete Trigger, der bei einem Delete nur diesen Datensatz aus der einen Tabelle löschen soll.

Nun möchte ich über ADODataSet.Delete einen Datensatz löschen, danach führe ich ein UpdateBatch aus.
Der Datensatz wird auch gelöscht, allerdings in beiden Tabellen aus der View, was ich ja eigentlich durch den Trigger verhindern wollte.

Was mache ich hier falsch ?

Gruß

Matthias

Peinhard 14. Mär 2008 08:05

Re: Problem beim ADODataSet.Delete
 
Guck dir doch mal mit dem Profiler an, welche Befehle der ADODataset tatsächlich an die SQL-Engine rausschickt...

onkelmehli 14. Mär 2008 11:51

Re: Problem beim ADODataSet.Delete
 
danke für den Tipp, leider finde ich den Profiler nicht bei SQL 2005, oder gibt es den dort nicht ?
Hab mir mal den SqlExpressProfiler aus dem Netz geladen.
Dieser zeigt mir an, das ein Delete auf die eine Tabelle und danach auf die andere Tabelle gemacht wird. :gruebel:

Also wenn das mit den DataSets so nicht funktioniert, kann man sich doch den Trigger sparen und den "eigentlichen" Delete-Befehl (aus dem Trigger) in eine separate StoredProc packen und diese dann ausführen ? Ich dachte, das Instead of Trigger dazu da sind, um genau dies zu umgehen ?

Gruß Matthias

Peinhard 14. Mär 2008 12:22

Re: Problem beim ADODataSet.Delete
 
Schuld an diesem Verhalten ist die etwas luschige Art, in der die ADODataset gestrickt sind. Umgehen kannst du das bspw mit dem BetterADODataset, bei dem du die ADO-Property 'Unique Table' setzen kannst, oder indem du dich in den Event OnBeforeDelete hängst, dort das 'richtige' DELETE-Statement absetzt und den 'eingebauten' Vorgang anschliessend mit SysUtils.Abort abbrichst - oder überhaupt eine Routine schreibst, die du statt ADODatase.Delete aufrufst. Auf Datenbank-Ebene würde ich das nicht unbedingt lösen wollen.

onkelmehli 14. Mär 2008 13:17

Re: Problem beim ADODataSet.Delete
 
Zitat:

....indem du dich in den Event OnBeforeDelete hängst, dort das 'richtige' DELETE-Statement absetzt und den 'eingebauten' Vorgang anschliessend mit SysUtils.Abort abbrichst - oder überhaupt eine Routine schreibst, die du statt ADODatase.Delete aufrufst.
das Problem an der ganzen Sache ist nur, ich müsste die Datenmenge in der DataSet dann neu laden, damit der gelöschte nicht mehr angezeigt wird.
Ich kann aber die DataSet aus verschiedenen Gründen nicht nach dem Delete schliessen und wieder öffnen (auch kein refresh etc.)

Peinhard 14. Mär 2008 14:57

Re: Problem beim ADODataSet.Delete
 
Dann bleibt dir als einfache Lösung immer noch TBetterADODataset. Nach einer Anspassung der INC-Datei auf Delphi2007 sollte er auch problemlos laufen. Zur Lösung deines Problems guckst du im kommentierten Interface bzw der Hilfe unter 'Unique_Table' und Konsorten. Das Ding macht auch sonst ein paar Sachen 'richtiger' als das mitgelieferte Exemplar.

onkelmehli 14. Mär 2008 15:06

Re: Problem beim ADODataSet.Delete
 
ok danke erst einmal, werd mir das am Wochenende mal in Ruhe anschauen.

Gruß Matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:13 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