| Autor |
Beitrag |
rob87
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Do 06.11.08 16:26
Hallo zusammen,
ich hab grad mal ein kleines Problem.
Wenn ich mit einer ADOQuery-Komponente einen Delete mach, muss ich ja nach dem
Delphi-Quelltext 1: 2:
| Qry1.ExecSQL; Qry1.Transaction.Commit; |
auch irgendein CommitRetaining, etc. machen. Aber irgendwie find ich des grad ned. Commit, CommitRetaining, oder Transaction.Commit; gibts beim AdoQuery nicht??
Denn aktuell krieg ich bei einem erneuten Locate-"Versuch" folgende Meldung:
Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf. geändert"
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 06.11.08 16:59
Eine Transaktion muss erstmal gestartet werden. Nach dem Ausführen der Befehle bestätigt man die Ausführung ('Commit') oder verwirft sie ('Rollback'). Mit ADO geht das in etwa so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| ADOConnection.BeginTrans; Try ADOConnection.Commit; Except ADOConnection.Rollback; Raise End; |
So oder ähnlich.
_________________ Na denn, dann. Bis dann, denn.
|
|
rob87 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Do 06.11.08 17:13
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 07.11.08 09:32
rob87 hat folgendes geschrieben : | ..Aber meine TADOQuery-Komponente kennt kein Commit oder Rollback ???[delphi]
|
Aber die ADOConnection. Das ist ein eigenes Objekt der Klasse 'TADOConnection'. Bei meinen Projekten habe ich ein TDatamodule, in dem eine TADOConnection und diverse TADOQuery/TADODataset-Komponenten liegen. Alle sind dann mit der TADOConnection verbunden. Hier könntest Du auch eine Zugriffsteuerung (Login) verwenden (LoginPrompt-Eigenschaft).
_________________ Na denn, dann. Bis dann, denn.
|
|
rob87 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Fr 07.11.08 10:38
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 07.11.08 10:39
Nein, aber es hätte sein können, das Du das Connection-Objekt nicht kennst.
_________________ Na denn, dann. Bis dann, denn.
|
|
rob87 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Fr 07.11.08 12:03
alzaimar hat folgendes geschrieben : | | Nein, aber es hätte sein können, das Du das Connection-Objekt nicht kennst. |
Doch. doch.
Aber ich kenn halt von TIBQuery die Methoden Transaction.Commit; oder Transaction.CommitRetaining;
Und ich denk, dass ich des nach meinem TAdoQuery1.ExecSQL; auch brauch
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 07.11.08 12:08
rob87 hat folgendes geschrieben : | | Und ich denk, dass ich des nach meinem TAdoQuery1.ExecSQL; auch brauch |
Nein, sondern mein Pattern.
_________________ Na denn, dann. Bis dann, denn.
|
|
rob87 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Fr 07.11.08 12:25
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 07.11.08 13:06
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| ADOConnection.BeginTrans; Try DeineADOQuery.ExecSQL; ADOConnection.Commit; Except ADOConnection.Rollback; Raise End; |
_________________ Na denn, dann. Bis dann, denn.
|
|
rob87 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Fr 07.11.08 13:11
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 07.11.08 13:19
Gut, das Eine hat mit dem Anderen ja nichts zu tun. Ich hatte die Fehlermeldung gar nicht beachtet, sondern nur Dein Bestreben, eine Transaktion ordendlich abzuwickeln (übrigens ist das bei einer einzigen Zeile, z.B. 'INSERT' oder 'UPDATE' nicht nötig)
Du machst also mit der ADOQuery ein 'DELETE' und versuchst an anderer Stelle dann, diesen Wert zu finden oder wie?
_________________ Na denn, dann. Bis dann, denn.
|
|
rob87 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Fr 07.11.08 13:53
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 07.11.08 13:59
Und wo kommat das ExecSQL vor?
_________________ Na denn, dann. Bis dann, denn.
|
|
rob87 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Fr 07.11.08 14:31
alzaimar hat folgendes geschrieben : | | Und wo kommat das ExecSQL vor? |
Des wird davor ausgeführt. Vor diesem Codeschnipsel
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 07.11.08 14:34
Ach so. Das Dataset, mit der Du das Locate/Edit/Post machst, weiss doch gar nicht, das Du etwas gelöscht hast. Das der Fehler beim Locate kommt, ist zwar merkwürdig (ich würde beim Post eine entsprechende Fehlermeldung erwarten), aber egal.
Wenn Du z.B. Edit... Post ausführst, wird eine UPDATE-Anweisung generiert und die zum Server geschickt. Normalerweise antwortet der mit 'Danke, ich habe 1 Zeile verändert'. Und ADO ist zufrieden, weil genau das erwartet wurde. Nun wird eine eben gelöschte Zeile per UPDATE verändert. Geht ja nicht, also schickt der Server 'Danke, ich habe 0 Zeilen verändert'. Und dann kommt dieser Fehler.
_________________ Na denn, dann. Bis dann, denn.
|
|
rob87 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Fr 07.11.08 14:50
alzaimar hat folgendes geschrieben : | Ach so. Das Dataset, mit der Du das Locate/Edit/Post machst, weiss doch gar nicht, das Du etwas gelöscht hast. Das der Fehler beim Locate kommt, ist zwar merkwürdig (ich würde beim Post eine entsprechende Fehlermeldung erwarten), aber egal.
Wenn Du z.B. Edit... Post ausführst, wird eine UPDATE-Anweisung generiert und die zum Server geschickt. Normalerweise antwortet der mit 'Danke, ich habe 1 Zeile verändert'. Und ADO ist zufrieden, weil genau das erwartet wurde. Nun wird eine eben gelöschte Zeile per UPDATE verändert. Geht ja nicht, also schickt der Server 'Danke, ich habe 0 Zeilen verändert'. Und dann kommt dieser Fehler. |
Aber ich denk dass des bei mir trotzdem noch a bissal anders geregelt is.
Ich hab mehrere Daten in meiner Tabelle. Nun wird ein Teil gelöscht (meinetwegen alle mit dem Wert A im Attribut "Status"). Mittels ExecSQL. Später wird geschaut, ob für den status a schon werte da sind. wenn ja, werden diese überschrieben, wenn nicht eingefügt.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 07.11.08 14:58
_________________ Na denn, dann. Bis dann, denn.
|
|
rob87 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Fr 07.11.08 15:35
Zuletzt bearbeitet von rob87 am Fr 07.11.08 15:47, insgesamt 1-mal bearbeitet
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 07.11.08 15:47
Falsche Antwort auf die Preisfrage. Daher hat es noch nicht 'klick' gemacht.
Nach dem 'MyDataset.Open' wird der Inhalt der Tabelle in den Speicher deines PCs geladen. Danach löschst Du auf dem Server die Tabelle. Das 'MyDataset' weiss davon aber Nichts. Woher auch, das hat ihm ja noch niemand gesteckt.
Richtige Antwort: "Die gesamte Tabelle"
Anderes Beispiel:
2xPC (A und B)
A lädt die Tabelle.
B löscht sie.
A weiss davon nix und sieht die Tabelle immer noch auf dem Bildschirm.
Ob A und B zwei PCs oder nur zwei Objekte in deiner Anwendung sind, ändert nix.
Jetzt klar?
_________________ Na denn, dann. Bis dann, denn.
|
|