AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken TAdoQuery Row cannot be located .. bei post
Thema durchsuchen
Ansicht
Themen-Optionen

TAdoQuery Row cannot be located .. bei post

Ein Thema von norwegen60 · begonnen am 29. Sep 2017 · letzter Beitrag vom 9. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2      
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#1

TAdoQuery Row cannot be located .. bei post

  Alt 29. Sep 2017, 01:31
Datenbank: Mssql • Version: 2008 • Zugriff über: TAdo
Hallo,

ich habe ein sehr seltsames Phänomen bei einem übernommen Programm. Der Programmierer hat dort folgendes Konstrukt programmiert:

Delphi-Quellcode:
  Table1.Append;
  Table1['Field1'] := 'Wert1';
  Table1['Field2'] := 'Wert2';
  Table1['Field3'] := 'Wert3';
  Table1['Field4'] := 'Wert4';
  
  try
    Table1.Post;
  except
  end
  Table1.Edit;

  Table1['Field5'] := 'Wert5';
  Table1['Field6'] := 'Wert6';

  try
    Table1.Post;
  except
  end
  Table1.Edit;
  usw....
Beim zweiten Post kommt immer die Exception: Row cannot be located for updating. Some values may have been changed since it was last read
Oder auf Deutsch: die zum aktualisieren angegebene zeile wurde nicht gefunden: einige werte wurden seit dem letzten lesen geändert

Warum der Programmierer zwischen drin immer wieder Post/Edit aufruft muss ich noch ermitteln. Trotzdem möchte ich wissen, was diese Fehlermeldung hervorrufen kann. Table1 ist mit keinem Ereignis oder Datasource verbunden und es greift sicher auch kein anderer Prozess auf den Datensatz zu.
Ich habe folgendes versucht
  • Ursprünglich war Table1 ein TAdoTable. Eine Änderung auf TAdoQuery brachte keine Abhilfe.
  • Auch die mir genehmere Langschreibweise Table1.FieldByName('Field5').AsString brachte nichts
  • Sobald ich Table1['Field5'] := 'Wert5'; vor das erste Post schiebe, funktioniert alles
  • Field5 ist ein einfaches nvarchar(30)-Feld wie die anderen auch
  • Das Problem kann mit Datenbanken unterschiedlicher Installationen nachvollzogen werden, tritt aber immer mit demselben Feld auf
  • Das Feld hat keinerlei Indizes, Einschränkungen oder sonstiges

Hat jemand eine Idee woran das liegen kann

Danke
Gerd
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: TAdoQuery Row cannot be located .. bei post

  Alt 29. Sep 2017, 01:37
Ist das wirklich der komplette Auszug? Oder fehlt da noch was zwischen dem Table1.Edit und dem Table1['Field5'] := 'Wert5'; ? Weil so sollte das eigentlich funktionieren.

Auf der anderen Seite könntest du auch sagen, dass du seinen SourceCode optimierst und dann auch die Felder gleich vor dem ersten Post (be)schreibst. Macht ja nur Sinn und beschleunigt das Programm auch etwas. Ich würde solche Stellen direkt überarbeiten wenn ich mir sicher bin, dass das Programm danach genau gleich oder sogar besser/effizienter arbeitet.
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#3

AW: TAdoQuery Row cannot be located .. bei post

  Alt 29. Sep 2017, 01:50
Ist das wirklich der komplette Auszug? Oder fehlt da noch was zwischen dem Table1.Edit und dem Table1['Field5'] := 'Wert5'; ? Weil so sollte das eigentlich funktionieren.

Auf der anderen Seite könntest du auch sagen, dass du seinen SourceCode optimierst und dann auch die Felder gleich vor dem ersten Post (be)schreibst. Macht ja nur Sinn und beschleunigt das Programm auch etwas. Ich würde solche Stellen direkt überarbeiten wenn ich mir sicher bin, dass das Programm danach genau gleich oder sogar besser/effizienter arbeitet.
Ja, das ist alles. Im Except wird noch in ein Log geschrieben, aber sonst ist es alles. Was fehlt denn noch? Der wollte einfach immer wieder Zwischenspeichern (Auch wenn es gar kein Sinn macht, wenn der Datensatz unvollständig ist)

Durch das Optimieren bin ich da ja drauf gestoßen. Aber die Zuweisungen ziehen sich über 1000 Zeilen, also nicht mal so auf dei Schnelle optimiert, auch wenn eine Überarbeitung dringenst nötig wäre. Der Fehler tritt aber schon im zweiten post-Edit Block auf.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: TAdoQuery Row cannot be located .. bei post

  Alt 29. Sep 2017, 07:55
Wie sieht es denn mit einem Primary Key auf der Tabelle aus.
Gruß, Jo
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.201 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TAdoQuery Row cannot be located .. bei post

  Alt 29. Sep 2017, 08:46
Check mal, ob es ev einen Filter gibt, der dafür sorgt, dass nach dem Post ein anderer Datensatz den Fokus hat.
Kontrolliere mal Indices, ob es da welche gibt, die die Sichtbarkeit beeinflussen.

Sind die Zuweisungen wirklich "Wert1" etc?

Die Table ist ja an eine Datenbank gebunden. Welche ist das denn? Kannst du anzeigen lassen, was direkt auf der Datenbank passiert, mit einem Trace oder Profiler?

Bei den Felddefinitionen gibt es die Einstellung, wie die Aktualisierung in der DB durchgeführt werden soll + welche Felder berücksichtigt werden sollen: KeyOnly, WhereChangedOnly etc. Schau mal, ob sich die Felder da unterscheiden.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: TAdoQuery Row cannot be located .. bei post

  Alt 29. Sep 2017, 09:53
Der Fehler ist typisch, wenn man die Ergebnismenge eines SQLs wie eine Tabelle verändert und dabei ein Schlüsselwert geändert wird.
Ebenfalls tritt der Fehler auf, wenn durch eine Änderung mehrere Sätze betroffen sind und man dann später einen bereits geänderten Satz ein weiteres mal ändern will.

Z. B. sowas:select * from tabelle where field1 = :wert1 Wird nun Field1 ein neuer Wert zugewiesen, und ist nicht (zwingend) eindeutig, so kann die Datenbank nicht mehr sicher feststellen, welcher Datensatz geändert werden soll. Dies führt (u. a.) zur vorliegenden Fehlermeldung.
Alternativ könnten hier bei einer Wertzuweisung auf field1 mehrere Sätze geändert werden. Möchte man nun einen so geänderten Satz ändern, ist der genannte Fehler unvermeidlich.

Um hier etwas genauer auf einen möglichen Fehler prüfen zu können, schau bitte mal, ob Table1 ein Attribut RowsAffected (o. ä.) hat. Wenn direkt nach einem Post dort ein Wert > 1 enthalten ist, wurden mehrere Sätze geändert und die Änderung eines dieser Sätze führt im späteren Verlauf zwingend zu dieser Fehlermeldung.

Das vom Programmierer gewählte Vorgehen funktioniert nur dann, wenn in der Auswahl der Daten garantiert ein eindeutiger Schlüssel vorhanden ist und der Schlüssel nicht geändert wird und sichergestellt ist, dass eine Änderung nur einen Satz betrifft.

Es handelt sich hier eher um eine sehr instabile Vorgehensweise.

Um zu schauen, ob das Konstrukt überhaupt sicher aufrecht zu erhalten ist, müsste man mal sehen, wie die Datenauswahl für Table1 aussieht und auch mal des Createstatement der zugrundeliegenden Tabelle "begutachten".

Eventuell ist es aber sinnvoller, sich von dieser Routine (ohne weitere Nachforschung) zu verabschieden und die Änderungen per SQL-Update durchzuführen.

Sofern mit der Table1 keine Datasource und keine Anzeigekomponenten verbunden sind, würd' ich mir hier keine Gedanken machen, sondern die Routine wegwerfen und die Änderungen per Update table set field1 = :Wert1 ... where Schlüsselspalte = :Schlüsselwert machen.

Die Chance, dass das vorhanden Konstrukt nicht dauerhaft sicher und fehlerfrei "hinzubekommen" ist, ist sehr groß.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: TAdoQuery Row cannot be located .. bei post

  Alt 29. Sep 2017, 22:26
Die Chance, dass das vorhanden Konstrukt nicht dauerhaft sicher und fehlerfrei "hinzubekommen" ist, ist sehr groß.
Etwas weniger diplomatisch ausgedrückt, wer die Daten einer Tabelle ohne eindeutige Identifizierung der Datensätze (PrimaryKey) bearbeitet und sich auf Nebeneffekte verläßt (z.B Sortierung) der handelt verantwortungslos.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: TAdoQuery Row cannot be located .. bei post

  Alt 29. Sep 2017, 23:05
Also ich weiß nicht ob es hilfreich ist, dataset Befehle und SQL Queries in den Hinweisen zu vermischen.
Ein SQL Befehl ist vollkommen transparent, er braucht auch keinen PK. Alle Datensätze, die laut Where Bedingung betroffen sind, werden aktualisiert, analog bei Delete. Da ist sogar eine Sortierung egal, sie kann nicht mal angegeben werden.

Die Frage ist doch, wie ein Append im Dataset gegen eine spezifische DB implementiert ist und wie mglw gesetzte Eigenschaften des Datasets wie bspw. Filter, Sort ... da reinspielen. Und: Da append nicht insert ist, ein anhängen aber sehr wohl was anderes als ein insert, spielt hier schon eine Reihenfolge eine Rolle und eben die Frage, ob überhaupt ein PK definiert ist.

Dann gibt es noch Verfahren, die beim Update eine where Clause aus den alten Feldwerten bauen, um zu vermeiden, dass Daten aktualisert werden, die zwischenzeitlich verändert wurden. Das würde wohl direkt zu einer solchen Fehlermeldung führen.

Um das zu prüfen, müsste man mal die Post Events durchschauen und ob da noch irgendwelche anderen Komponenten verdrahtet sind.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: TAdoQuery Row cannot be located .. bei post

  Alt 30. Sep 2017, 10:17

Natürlich hast Du recht, mir ging es nur darum einen Datensatz eindeutig zu identifizieren. damit man alle Änderungen mit diesem Datensatz durchführen kann. Ein beliebter Fehler ist ja das Prinzip
Hole Datenmenge where Datum = 01.01.2001
ändere in Datenmenge Datum in 02.01.2001
Hole Datenmenge where Datum = 01.01.2001
ändere in Datenmenge Betrag in 0,01 ===> keine Datensätze verfügbar!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: TAdoQuery Row cannot be located .. bei post

  Alt 30. Sep 2017, 10:59
Was mir gerade noch einfällt:

Im Ausgangspost wird zuerst ein Append gemacht, Werte vergeben gespeichert. Dann der Satz wieder editiert und gespeichert.

Bei Append und anschließenden Post sind im Dataset in der Regel die technischen Schlüssel der Datenbank, die per Trigger, Sequence, AutoInc ... von der Datenbank vergeben werden nicht bekannt. Auch hier tritt der genannte Fehler auf.

Datenbank und Dataset können sich quasi nicht darauf einigen, welcher Datensatz zu ändern ist, da sie nicht gegenseitig über alle zur Identifizierung benötigten Informationen verfügen.

Erste Lösungsmöglichkeit wäre, die "zwischengeschobenen" Edits und Post zu entfernen.
Delphi-Quellcode:
Table1.Append;
  Table1['Field1'] := 'Wert1';
  Table1['Field2'] := 'Wert2';
  Table1['Field3'] := 'Wert3';
  Table1['Field4'] := 'Wert4';
  Table1['Field5'] := 'Wert5';
  Table1['Field6'] := 'Wert6';
  usw....
  // Erst dann, wenn alle Werte vergeben wurden.
  try
    Table1.Post;
  except
  end;
Eine Änderung des Datensatzes ist erst möglich, wenn er aus der Datenbank gelesen wurde, z. B. Table1.Refresh und Positionierung auf dem Satz.
  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 05:59 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