Announcement

Collapse
No announcement yet.

Die zum aktualisieren angegebene zeile wurde nicht gefunden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Die zum aktualisieren angegebene zeile wurde nicht gefunden

    Hallo Liebe Entwickler Gemeinde ...

    ich bin am Verzweifeln ..

    ich komme bei der Fehlermeldung
    'Die zum aktualisieren angegebene zeile wurde nicht gefunden' ....
    nicht weiter.

    Gegebenheiten :
    - MS SQL SERVER 2000 |Delphi 7 | Multi-User Anwendung
    - Properties['Update Criteria'].Value := adCriteriaKey bereits verwendet ...
    (und bereits viele Beiträge zu obigem Fehler gelesen bzw. im
    Delphi und Ado Buch von Herrn Kosch recherchiert .....)

    Bei meiner Anwendung öffne ich eine Tabelle mit Aufträgen
    und zeige diese in einem DBGrid an.

    CursorLocation = clUseClient
    Cursortype = ctStatic


    Zwei User sehen sich also an ihren Arbeitsplätzen dieses DBGrid
    mit z.B. 20 Datensätzen an.
    USer1 ändert dann den 5.Datensatz , indem er einen Menüpunkt im
    Programm aufruft. Die Änderungen werden mit Adoquery.Post abgeschlossen
    und in seinem DBGrid auch richtig angezeigt.

    Kurz danach möchte User2 den 9. Datensatz ändern. Er hat also
    mit dem 5.Datensatz nichts zu tun. Bei dem Versuch, etwas an
    diesem Datensatz im DBGrid etwas zu ändern, bekommt er die
    obige Fehlermeldung. Jeder Versuch mit dem Programm weiter zu
    arbeiten gibt weitere Fehlermeldungen. Er kann auch das Adoquery
    nicht mehr schliessen und neu öffnen.

    An der Update Criteria Einstellung kann es nicht mehr liegen, und theoretisch
    dürfte ja Datensatz 9 auch keine Probleme bereiten beim ändern,
    selbst wenn vom Provider dazu eine UPDATE ANweisung mit langer
    WHERE-Klausel generiert wird. Denn Datensatz 9 wurde ja nicht geändert und
    hat mit Datensatz 5 nichts zu tun.

    Ich bitte euch um Hilfe ....bestimmt ist es nur eine Kleinigkeit und ich
    habe nur irgendeinen Denkfehler ....
    Denn die Situation dass eine DBGrid und das darunterliegende Recordset
    nicht mehr ganz aktuell sind, wird und muss es ja in einer Multiuser
    Umgebung immer geben, nicht wahr ???

  • #2
    Hallo Jörg,

    ich kann nicht sagen ob es eine Kleinigkeit ist, bei mir kommt sie ständig, trotz allen beschriebenen Maßnahmen.

    Allerdings, habe ich festgestellt, dass die Datenbank alles richtig macht, und kann einfach das Ergebnis an das Recordset nicht richtig übergeben. Deswegen meine Lösung, die bisher 100% funktioniert hat:

    A : TADODataset;

    try
    A.post;
    except
    on E : Exception do begin
    A.DisableControls;
    A.Close; A.Open; {oder A.requery}
    if (E is EOLEException) then begin
    if (E as EOleException).ErrorCode <> -2147217864 //Die zum Aktualisieren... Error abfangen
    then showmessage (E.Message);
    end else showMessage (E.Message);
    A.EnableControls;
    end;
    end;

    Dazu kann man noch den aktuellen Datensatz merken und mit locate wieder dahin positionieren. Funktioniert allerdings nur beim Editieren der nicht-Schlüssel-Felder.

    Gruß

    Comment


    • #3
      Hallo!

      Verwende doch mal den Profiler vom SQL Server um die generierten SQL Statements zu prüfen. Dort sollte dann auch das Statement erscheinen, das den Fehler verursacht.

      Vielleichts hilfts...

      Das geschilderte Problem ist bei uns unbekannt!!!!

      BYE BERND

      Comment


      • #4
        Gibt es in der Tabelle einen Primärschlüssel?

        Comment


        • #5
          Hallo zusammen,

          mit dem Fehler habe ich mich auch schon ein paar Mal herumgeschlagen.
          Inzwischen glaube ich zu wissen wie er zustandekommt und wie man
          ihn beheben kann. Siehe den folgenden Abschnitt:

          Beschreibung:
          Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf. geändert.

          Diese Fehlermeldung deutet an, dass in einem Grid, einer Abfrage, bzw. in irgendeiner Datenmenge ein Datensatz nicht eindeutig identifiziert werden konnte. Beispiel:

          Anzahl Artikel Preis
          1 Tisch 100
          1 Stuhl 50
          1 Tisch 100

          Beim Versuch den letzte Datensatz zu ändern entsteht obige Fehlermeldung, weil die Abfrage nicht identifizieren kann, ob der erste oder der letzte Datensatz gemeint ist. Selbst dann, wenn in einem Formular diese Tabelle angezeigt wird und der letzte Datensatz markiert ist, kann die Abfrage den Datenssatz nicht eindeutig identifizieren. Das liegt daran, dass die Änderungsanweisung in Form eines SQL-Befehls an die Datenbank weitergereicht wird. Es gibt aber in SQL keine Möglichkeit zu formulieren, dass in diesem Fall genau der letzte Datensatz gemeint ist. Die Änderungsanweisung würde also beide Datensätze betreffen, obwohl nur einer gemeint war. Das führt zum Konflikt.

          Abhilfe:
          Bauen Sie ein zusätzliches Schlüsselfeld ein und deklarieren Sie dieses als Primary Key. Dadurch wird die eindeutige Kennzeichnung eines jeden Datensatzes gewährleistet. Hier bieten sich z.B. Counter-Felder an (in Access ist damit der Typ Autowert, in SQL Server der Typ int, Eigenschaft Identität=Ja gemeint).
          Übrigens habe ich die Erfahrung gemacht, dass es unter Umständen nur mit einem Primary Key klappt, der aus einem einzelnen Feld besteht. Ein Primary Key der aus mehreren Feldern besteht, schafft möglicherweise keine Abhilfe!

          Ich hoffe das hilft euch weiter. Viele Grüße,
          Klaus Messner
          [email protected]

          Comment

          Working...
          X