![]() |
Datenbank: MS-SQL • Zugriff über: ADO
ADO (automatische DB Syncronisierung verhindern)
Hi,
es ist fast peinlich zu fragen, aber ich hab da 'n Problem. :oops: Das ganze passiert mir mit den lustien dbGo-Komponenten (ADO).
Delphi-Quellcode:
Meiner Meinung nach dürfte der neue Text nicht in die Datenbank geschrieben worden sein (erst nach Update bzw. ExecSQL bei Insert etc.).
query.edit;
query.fieldbyname( 'example' ).asstring := 'bla'; query.close; Tatsächlich verhält sich das leider bei mir grad etwas anders. :gruebel: 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. :evil: MfG und thx //Edit: ![]() |
Re: ADO (automatische DB Syncronisierung verhindern)
Zitat:
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:
Delphi-Quellcode:
DBGrid.Options := DBGrid.Options + [dgCancelOnExit]
|
Re: ADO (automatische DB Syncronisierung verhindern)
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 :wall: |
Re: ADO (automatische DB Syncronisierung verhindern)
Zitat:
|
Re: ADO (automatische DB Syncronisierung verhindern)
Doch, hab ich, aber ich habe vergessen zu sagen, dass ich das getan habe. :stupid:
Beide werden ausgeführt. |
Re: ADO (automatische DB Syncronisierung verhindern)
Zitat:
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. |
Re: ADO (automatische DB Syncronisierung verhindern)
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:
:wiejetzt: //Edit: die Daten werden immer dann syncronisert wenn ich (abgesehen von first und next) navigiere. |
Re: ADO (automatische DB Syncronisierung verhindern)
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: ![]() |
Re: ADO (automatische DB Syncronisierung verhindern)
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:
Delphi-Quellcode:
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.
Connection.Locktype := ltBatchOptimistic
|
Re: ADO (automatische DB Syncronisierung verhindern)
Zitat:
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. :mrgreen: Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz