![]() |
Problem mit ADOTable und Refresh
Immer wenn ich mit das aufrufe (Steht in TADOTable.AfterPost), also nen Datensatz poste
Delphi-Quellcode:
Krieg ich ne Fehlermeldung:
TADOTable.Refresh;
Code:
Liegt das an der TADOTable? Oder muss ich noch was beachten
Nicht genügend Schlüsselfeldinformationen zum Aktualisieren
|
Re: Problem mit ADOTable und Refresh
Hallo,
probier es mal damit verwende statts einen
Delphi-Quellcode:
folgende Zeilen
ADOtable.Refresh;
Delphi-Quellcode:
ADOtable.Close;
ADOtable.Open; |
Re: Problem mit ADOTable und Refresh
Hi,
ist ein Bug in der TAdotable, wenn Du Dir ganz viel Ärger ersparen willst, zieh dir TBetterAdodataset aus dem Netz. Ist Freware, links über Google oder auch per Suche hier in der DP. Grüsse Woki |
Re: Problem mit ADOTable und Refresh
@trifid: Bringt mir nichts. Dann bin ich nach dem "open" beim ersten Datensatz. Das will ich aber nicht.
@woki: Hab ich schon, bin aber noch nicht ganz durchgestiegen Ausserdem hab ich bei mir jetzt noch nen TClientDataSet und nen TDataSetProvider eingebaut, und in meinem ClientDataSet in AfterPost das reingeschrieben
Delphi-Quellcode:
Jetzt wird zwar beim posten der Datensatz gespeichert, aber wenn ich unter dieser zeile ein
ClientDataSet1.ApplyUpdates(0);
Delphi-Quellcode:
ausführe, passiert nix. Ich muss die Tabelle schließen und wieder öffnen, dann bin ich aber wieder beim ersten Datensatz und bei großen Tabellen ist das auch eine nicht sehr gute Lösung
ClientDataSet1.Refresh
|
Re: Problem mit ADOTable und Refresh
welchen Datenbanktreiber nutzt du?
welche Datenbank? bei den ADO hilft eigentlich immer zum refreshen nur die holzhammermethode cose und dann open diesen tip habe ich vom Andreas Kosch - und der sollte es wissen aber hier noch eine andere ausführung aus dem Entwicklerforum Zitat:
|
Re: Problem mit ADOTable und Refresh
Zitat:
Also das Refresh mit ADOTable klappt gar nicht. Mit dem BetterADODataSet funktioniert nur das Requery bzw. das Refresh wenn ich
Delphi-Quellcode:
gesetzt hab, was aber beides das gleiche ist, oder?
RefreshType := rtRequery
Auf jeden Fall hab ich nach nem Requery zwar alle Datensätze aktualisiert, aber leider bin ich dann immer beim ersten Datensatz. Kann das an nem Insert liegen? Es geht darum, dass wenn ich nen neuen Datensatz einfüge ein Trigger ausgeführt wird der im ID-Feld automatisch einen Wert anlegt. Will einfach nur das direkt nach dem Insert ein Refresh aufgerufen wird, damit der Wert sofort angezeigt wird und ich die Tabelle nicht neu öffnen muss (Also kein Close/Open). Geht das überhaupt? |
Re: Problem mit ADOTable und Refresh
Zitat:
Also bei Datenbankproblemen gehören doch auf jeden Fall die verwendeten Komponenten, die Datenbank, alles mit Versionen und das genaue Vorgehen gleich in die Frage. Grüsse Woki |
Re: Problem mit ADOTable und Refresh
Schon klar das mit der Frage. Aber ich wusste erst nicht woran der Fehler liegt, da es bei jeder Tabelle und bei der Datenbank passiert. Auch bei z.B. Access-Datenbanken
|
Re: Problem mit ADOTable und Refresh
Zitat:
Bei Access im Zusammenhang mit einem Autoincrementfeld ist es ein Bug, da hilft TBetteradodataset (kann man genauso verwenden wie eine TTable, muß man nur einstellen, du solltest aber mal auf SQL und Queries umsteigen, wenn du mit anderen Dingen als filebasierten Desktopdatenbanken arbeitest), Auf den Bug hatte ich auch einfach mal blind getippt. Bei der Version mit dem Trigger wäre auch verwunderlich wenn es funktionierte, denn für das refresh müßte er ja die Datensätze, die von der Datenbank kommen, mit den lokalen abgleichen, wie soll er das, wenn ein Trigger zwischendurch den Schlüssel eines Datensatzes verändert hat, wie soll er den dann für den Abgleich wiederfinden, ich denke hier kann man so nicht vorgehen. Grüsse Woki |
Re: Problem mit ADOTable und Refresh
wenn du access als DB benutzt welchen treiber ?
jet und wenn ja welche version auf weelchen os? |
Re: Problem mit ADOTable und Refresh
Hallo,
nebenbei, Access verhält sich unter den ADO-Komponenten von Borland in gewissen Bereichen anders wie eine SAP-DB7.4 . (JET-Engine contra OLE-DB-Provider) Von der TADOTable würde ich abraten und die TADODataSet verwenden. Wie die TBetterAdodataset bei einer SAP-DB sich verhält gehört erstmal getestet ... Jeder gibt zwar (s)eine Stellungsnahme ab, aber für eine profesionelle Entwicklung sind dafür keine wirklich getesteten Grundlagen oder Veröffentlichungen vorhanden. :( Sicher ist, dass die BetterDataSet für Access-Anwendungen die bessere Wahl ist, für klassische Datenbank-Server (wie gesagt) gehört diese auf jeden einzelnen Fall überprüft. :!: Nochmals, was anderes geht nicht - der Rest (requery, refresh, etc.) wurden nicht sauber von Borland realisiert (ich möchte hier aber auch nicht von Bug's sprechen :wink: )
Delphi-Quellcode:
id := ADODataSet.FieldByName('FeldID').asInteger;
// irgendein SQL-Command ADOCommand.CommandText := 'INSERT ...'; ADOCommand.Execute; ADODataSet.Close; ADODataSet.Open; ADODataSet.Locate ('FeldID', id, []); |
Re: Problem mit ADOTable und Refresh
HI,
und es ist doch ein Bug: Konstellation: Access, Autoincrementfeld, Jet Engine (mit welchen Versionen das getestet wurde weiß ich nicht mehr, es waren mehrere) Datensatz eingeben, posten, refresh aufrufen, es kommt die Fehlermeldung nicht genug Schlüsselinformationen. Wenn eine Funktion da ist, ud bei korrekter Verwednung sofort knallt, d.h. er versucht die Funktiona auszuführen und es kommt eine Fehlermeldung von der Datenbank... nenne ich das einen Bug. Aber es kommt noch viel schlimmer, nicht nur das ein refresh nicht geht, es entstehen auch schnell Situationen, in denen auch ein close open nicht mehr hilft, (Fehler: Datensatz wurde von einem anderen User geändert, und das wo man allein auf seiner Entwicklungsdatenbank rumarbeitet). Hier hilft dann nur noch ein Löschen der betroffenenen Datensätze, und dann neueingeben (post close etc geht alles nicht mehr). Das hat dann dazu geführt, das ein Kollege mal im simpelsten Denkbaren Fall, eine Tabelle mit Autoincrementfeld, Anbindung an Grid, Tadotable), in schierer Verzweiflung nach jedem Post ein Close open eingefügt hat. Nach jedem Eingeben springt der Cursor in die erste Zeile, ein Glück, das ich den Auftraggeber nicht hab fluchen hören. Die Ursache liegt in einer nicht korrekten Übergabe des von der Datenbank erzeugten Autoincrementwertes nach einem insert. Somit unterscheidet sich der Schlüssel im Client von dem in der Datenbank, und so kann man sich nichteinmal einen Schlüssel merken, um über locate den Cursor nach close open wieder richtig positinieren. Der Wert seteht dann ach vor dem Close Open auf dem Client nicht für den Aufbau von Relationen zur Verfügung etc. Dieser Mechanismus funktioniert bei BDE Paradox, Dbase, und auch bei TBetteradodataset und Access, also nenne ich das einen Bug. Ein vernünftiges Arbeiten war hier gar nicht möglich, da die Probleme durch ein simples download von TBetteradodataset zu lösen war, hat Borland sich das Geld gespart, die Probleme selbst nochmal zuu lösen. Weiterhin gibt es bei TADOTable heftige Probleme mit komplexeren Locates, da das locate auf dem Client stattfindet, und wenn man sich das Schichtenmodell das dem Zugriff über Ado auf beliebige DB's ansieht, sehe ich IMHO überhaupt keinen Grund, warum das was auf der Clientseite Fehler mit Access ausbügelt, diegleichen nicht mit anderen Datenbank ausbügelt, den die datenbankspezifischen Unterschiede werden ja in einer ganz anderen Schicht gehandelt, davon das alle Theorie keine praktischen Tests ersetzt mal abgesehen. Zuguterletzt sei noch erwähnt, das die Verwednung von TBetteradodataset auch der offizielle Tip von Borland (TeamB) in den hauseigenen Newsgroups war. Grüsse Woki |
Re: Problem mit ADOTable und Refresh
Hi!
Ich habe noch eine Frage zu den ADO Komponenten. Das ADOTable hat ja zimlich viele Bugs. Wie siehts mit dem ADOQuery aus? Kann man das unbeschwert verwenden? Gruss Fellmer |
Re: Problem mit ADOTable und Refresh
*Push*
|
Re: Problem mit ADOTable und Refresh
Ich pushe das Thema noch ein letztes Mal.
Danach gehe ich davon aus, dass die in Delphi 7 mitgelieferte Komonente TADOQuery keine Fehler enthält. Danke für alle, die sich meine Fragen angesehen haben :thuimb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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-2025 by Thomas Breitkreuz