Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#6

AW: TAdoQuery Row cannot be located .. bei post

  Alt 29. Sep 2017, 08: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