Announcement

Collapse
No announcement yet.

Vom SQL-Server geänderte Daten oder Mehrbenutzerbetrieb: Update-Problem!

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

  • Vom SQL-Server geänderte Daten oder Mehrbenutzerbetrieb: Update-Problem!

    Hallo,

    entschuldigt bitte, dass ich einen neuen Thread zu diesem Thema aufmache, aber das Problem ist allgemeiner geworden, so dass es sich nicht mehr nur auf Views bezieht.

    Mein Problem wurde netterweise hier schon ein wenig diskutiert:

    <a href="/webx?50@@.1dd05551">Stephan Schneider "VIEW with view_metadata?" 27.08.2003 18:25</a>

    Nachdem ich die Seiten im ADO-Buch von Herrn Kosch durchgearbeitet habe, ist mir einiges klarer, dennoch: Ein Blick in den Profiler des SQL-Servers verwirrt mich was meine Problematik noch mehr:

    (1) Mein INSERT-Trigger für den View ermittelt die Primärschlüsselwerte für die darunterliegeneden Basistabellen selbst. Im Client (Delphi) habe ich bis dato einen Dummy-Wert übergeben. Dies hat den Server bei einem anschließenden UPDATE-Versuch aus dem Konzept gebracht (daher die Fehlermeldung), da der PK-Wert, den der Client hatte natürlich nicht mit dem PK-Wert, den der Server generiert hat übereinstimmt. Simuliere ich den echten PK-Wert im Client und weise diesen dann dem persistenten Feld zu, können INSERT und UPDATE-Anweisungen mit dem View durchgeführt werden.

    (2) Das DELETE funktioniert aber seltsamerweise immer noch nicht, obwohl laut Profiler die Daten innerhalb der WHERE-Klausel (beim SQL-DELETE-Statement) richtig sind. Schließe ich die Datenmenge und öffne sie erneut, ist der Datensatz gelöscht. Laut Aussage im Buch von Herrn Kosch, erntet man die Fehlermeldung <i>Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf. geändert</i> deshalb, weil logischerweise die Daten, die der Client besitzt, veraltet sind. Operationen können aber nicht durchgeführt werden, da es innerhalbd er WEHERE-Klausel keine Übereinstimmig mit den echten, d.h. auf dem Server befindlichen Datensatz gibt. Wieso ist der Datensatz aber nach einem erneuten Öffnen der Datenmenge tatsächlich gelöscht? Entweder kann er löschen oder(!) ich bekomme diese Fehlermeldung, aber doch nicht beides auf einmal?

    Stephan

  • #2
    Hallo,

    wie sieht der vom Profiler mitprotokollierte vollständige Aufruf beim Löschen des Datensatzes aus?
    &#10

    Comment


    • #3
      Hallo Herr Kosch,

      Danke für Ihre Hilfe. Wenn es möglich wäre, würde ich Ihnen gerne ein kleines Demoprojekt (bei dem dieses Verhalten sichtbar ist) zukommen lassen. Falls ja, könnten Sie mir dann Ihre E-Mail-Adresse mitteilen, an die ich dieses kleine Demo schicken kann?

      Stepha

      Comment


      • #4
        Hallo Herr Kosch,

        nach eingehender Untersuchung des Profiler-Protokolls habe ich die Ursache ausgemacht, sie liegt in den Feldwerten der automatisch vom Server generierten UPDATE-Anweisung innerhalb der WHERE-Klausel (gleiches gilt natürlich für die DELETE-Anweisung).

        Sie haben in Ihrem Buch <i>ADO und Delphi</i> in Kapitel 7.6.3 einen Lösungsansatz für dieses Problem vorgestellt (die ausschließliche Verwendung des Primärschlüssels via Properties['Update Criteria'].Value := ... funktioniert bei einem View nicht, laut Protokoll werden nachwievor alle Felder in der WHERE-Klausel verwendet. Ist auch verständlich, da beim View kein PRIMARY KEY vorliegt).

        Wie kann ich aber diese einzelnen Aufrufe (UpdateBatch, Resync), die Sie über die jeweiligen Button-Klicks ausführen, automatisiert ablaufen lassen?

        Folgende Anweisungen im AfterPost()-Event des ADODatasets sind nicht immer von Erfolg gekrönt:<pre><code>
        with ADODataset1 do begin
        UpdateBatch(arAll);
        Recordset.Resync(adAffectAll, adResyncUnderlyingValues);
        UpdateCursorPos;
        end;
        </pre></code>

        Gruß<br>Stepha

        Comment

        Working...
        X