AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi ADO (automatische DB Syncronisierung verhindern)
Thema durchsuchen
Ansicht
Themen-Optionen

ADO (automatische DB Syncronisierung verhindern)

Ein Thema von opfer.der.genauigkeit · begonnen am 19. Dez 2005 · letzter Beitrag vom 5. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2      
opfer.der.genauigkeit

Registriert seit: 14. Feb 2005
66 Beiträge
 
#1

ADO (automatische DB Syncronisierung verhindern)

  Alt 19. Dez 2005, 09:45
Datenbank: MS-SQL • Zugriff über: ADO
Hi,

es ist fast peinlich zu fragen, aber ich hab da 'n Problem.
Das ganze passiert mir mit den lustien dbGo-Komponenten (ADO).

Delphi-Quellcode:
  query.edit;
  query.fieldbyname( 'example' ).asstring := 'bla';
  query.close;
Meiner Meinung nach dürfte der neue Text nicht in die Datenbank geschrieben worden sein (erst nach Update bzw. ExecSQL bei Insert etc.).
Tatsächlich verhält sich das leider bei mir grad etwas anders.
Sobald ich einen Wert übergebe, werden die lokalen Daten mit der Datenbank syncronisiert.

Soooo .. es gibt bestimmt ne Einstellung, die ich jedes mal Hilfe lesen übersehen habe.

Danke, ich hasse es an so Kleinigkeiten hängen zu bleiben.

MfG und thx

//Edit: Crossposting im DF
Stellen Sie sich bitte Zirkusmusik vor.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: ADO (automatische DB Syncronisierung verhindern)

  Alt 19. Dez 2005, 11:01
Zitat von opfer.der.genauigkeit:
Meiner Meinung nach dürfte der neue Text nicht in die Datenbank geschrieben worden sein (erst nach Update bzw. ExecSQL bei Insert etc.).
Tatsächlich verhält sich das leider bei mir grad etwas anders.
Wenn du recht hast, dann müsste auf jeden Fall das Event "BeforePost" gefeuert werden.
Ich würde da ein ShowMessage in den betreffenden Eventhandler setzen, um das herauszufinden.
Wenn an der Query ein DBGrid dranhängt, könnte das die Ursache für den unbeabsichtigten Post des Datensatzes sein.
Abhilfe:
DBGrid.Options := DBGrid.Options + [dgCancelOnExit]
Andreas
  Mit Zitat antworten Zitat
opfer.der.genauigkeit

Registriert seit: 14. Feb 2005
66 Beiträge
 
#3

Re: ADO (automatische DB Syncronisierung verhindern)

  Alt 19. Dez 2005, 11:52
Danke für die Antwort.
Für den Benutzer werden die Daten nur in einer Baumstruktur angezeigt, die nicht
Datenbank gebunden ist.
Irgendwas übersehe ich
Stellen Sie sich bitte Zirkusmusik vor.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: ADO (automatische DB Syncronisierung verhindern)

  Alt 19. Dez 2005, 12:14
Zitat von opfer.der.genauigkeit:
Irgendwas übersehe ich
Genau! du hast nicht überprüft, ob BeforePost und AfterPost abgefeuert wird.
Andreas
  Mit Zitat antworten Zitat
opfer.der.genauigkeit

Registriert seit: 14. Feb 2005
66 Beiträge
 
#5

Re: ADO (automatische DB Syncronisierung verhindern)

  Alt 19. Dez 2005, 12:48
Doch, hab ich, aber ich habe vergessen zu sagen, dass ich das getan habe.
Beide werden ausgeführt.
Stellen Sie sich bitte Zirkusmusik vor.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: ADO (automatische DB Syncronisierung verhindern)

  Alt 19. Dez 2005, 12:56
Zitat von opfer.der.genauigkeit:
Doch, hab ich, aber ich habe vergessen zu sagen, dass ich das getan habe. Beide werden ausgeführt.
Also doch. Dann setze mal einen Breakpoint im Eventhandler und lass dir den Aufrufstack anzeigen.
Vorher Compiler-Option "Mit Debug-DCUs" setzen.
So kannst du raus bekommen, ob [ADOQuery].Post aus [ADOQuery].Close heraus aufgerufen wird, oder ob ein Control (DBGrid oder sonstiges) seine Finger im Spiel hat.
Andreas
  Mit Zitat antworten Zitat
opfer.der.genauigkeit

Registriert seit: 14. Feb 2005
66 Beiträge
 
#7

Re: ADO (automatische DB Syncronisierung verhindern)

  Alt 19. Dez 2005, 13:42
Ich denke mittlerweile herrausgefunden zu haben woran es liegt.
Ich navigiere in der Datenmenge mit GotoBookmark.
Bei dieser Methode wird intern Resync aufgerufen.

Delphi-Hilfe:
Zitat:
Resync wird intern von den anderen Datenmengenmethoden verwendet, um die Datenmenge bei Änderungen der internen Cursorposition mit den zugrunde liegenden physischen Daten abzugleichen. In Anwendungen sollte die Methode Refresh anstelle von Resync aufgerufen werden.
Mist?


//Edit: die Daten werden immer dann syncronisert wenn ich (abgesehen von first und next) navigiere.
Stellen Sie sich bitte Zirkusmusik vor.
  Mit Zitat antworten Zitat
opfer.der.genauigkeit

Registriert seit: 14. Feb 2005
66 Beiträge
 
#8

Re: ADO (automatische DB Syncronisierung verhindern)

  Alt 3. Jan 2006, 20:41
Da ich nur ungerne Threads von mir liegen lasse, hier die Lösung:

Das Konzept von ADO hat per Default die Einstellung für implizite Transaktionen.
D.h. werden Daten geändert, werden diese direkt in die DB eingefügt bzw. wie in meinem
Fall durch das Resync abgeglichen.

Um dies zu verhindern muss mit expliziten Transaktionen über das ConnectionObjekt verarbeitet werden.
Dies kann durch den Aufruf von ADOConnection.BeginTrans eingeleitet und bei Bedarf mit CommitTrans oder RollbackTrans beendet werden.

Ich finde diese Regelung etwas seltsam, aber ok... man kann damit leben.

Evtl. kennt jemand noch eine andere Art für eine Lösung. Vielleicht eine noch bequemere?

Siehe: http://www.entwickler-forum.de/webx?....0@.4a872c60/0
Stellen Sie sich bitte Zirkusmusik vor.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: ADO (automatische DB Syncronisierung verhindern)

  Alt 3. Jan 2006, 20:50
Hi,
Das ADO jede Änderung nach Ändern das aktuellen Records speichert, hat Nichts mit Impliziten Transaktionen zu tun. Das macht die BDE genauso, und im Übrigen jeder TDataset-Abkömmling. Das ist doch der Sinn eines TDatasets.

Versuchs mal mit:
Connection.Locktype := ltBatchOptimistic Damit werden die Änderungen im ADO-Recordset gesammelt. Du kannst die Daten mit ApplyUpdates dann 'im Stapel', also innerhalb einer einzigen Transaktion zum Server blasen oder aber über CancelUpdates (?) wieder verwerfen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
opfer.der.genauigkeit

Registriert seit: 14. Feb 2005
66 Beiträge
 
#10

Re: ADO (automatische DB Syncronisierung verhindern)

  Alt 4. Jan 2006, 07:58
Zitat von alzaimar:
Hi,
Das ADO jede Änderung nach Ändern das aktuellen Records speichert, hat Nichts mit Impliziten Transaktionen zu tun. Das macht die BDE genauso, und im Übrigen jeder TDataset-Abkömmling. Das ist doch der Sinn eines TDatasets.
Dass die Datensätze automatisch mit der Datenbank abgeglichen werden hat laut MS schon etwas mit impliziten Transaktionen zu tun. Zumindest behaupten das einige Artikel die ich gefunden habe.
Es geht ja eigentlich um die "Default-Einstellung".

Die Änderung auf ltBatchOptimistic hat geholfen. Hättest dich ja auch wirklich mal früher melden können.
Danke
Stellen Sie sich bitte Zirkusmusik vor.
  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 16:23 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