Announcement

Collapse
No announcement yet.

fiese Fehlermeldung + ADO-DataSet träge?

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

  • fiese Fehlermeldung + ADO-DataSet träge?

    Hallo,
    ich arbeite mit D5P+ADOExpr. mit jeweils 1.Upd. & einem MSSQL7.
    Ich habe diverse Probleme aber eventuell führen die alle auf den gleichen Ursprung zurück.
    Eine Auftragstabelle ist als Master mit einer Positionlistentabelle als Detail verknüpft. Die Positionstabelle ist nochmals mit einer Stückliste Verknüpft. Das hinzufügen von neuen Positionen und Stücklistenposten läuft problemlos. Ferner habe ich mehrere StoredProcedures auf dem Server, die ein kopieren ermöglichen, auch hier kein Problem.
    1. Wenn ich allerdings einen Auftrag oder eine hierarchisch tieferligende Position löschen möchte kommt die Fehlermeldung: 'Schlüsselinformationen sind
    ungenügend oder inkorrekt. Es sind zu viele Zeilen von der Aktualisierung
    betroffen'
    In den jeweiligen Tabellen auf dem Server habe ich Deletetrigger gesetzt, die jeweils vorhandene Detaileinträge löscht in der Form:

    //* Auftragstrigger
    DELETE FROM Positionen
    WHERE AuftrNr in ( SELECT AuftrNr FROM deleted )

    //* Positionstrigger
    DELETE FROM StkLst
    WHERE PositionsNr in ( SELECT PositionsNr FROM deleted )

    Wenn ich mit dem QueryAnalyzer den Auftrag lösche, geht er ohne zucken weg.
    Nutze ich allerdings ein ADODataSet.Delete kommt die oben beschriebene Meldung. Bei einer anderen Master/Detail-Verknüpfung mit entsprechender Triggerung habe ich die selbe Fehlermeldung, allerdings nur wenn die Detailtabelle 0 oder 2 Einträge hat (also völlig bräsig). Bei einem und dreien klappt es. Und nun das kurioseste dieses Verhalten tritt nicht immer auf. Entweder es treten alle Symptome auf oder nur ein paar oder gar keins.
    Zwar wurde vor ein paar Wochen bereits ein ähnlicher Beitrag diskutiert, nur konnten mir die dort beschriebenen Löungen nicht weiterhelfen, z.B. clServer statt clClient.

    2. In einer Master/Detail-Verknüpfung tritt bei mir häufiger das Problem auf, daß in der Detailtabelle die Masterfilterung nicht immer funktioniert.
    So stehen beispielsweise nach einem Post der Mastertabelle <b>SÄMTLICHE</b> Datensätze der Detailtabelle im Detail-Grid, auch wenn ich nachher ein ADODataSet.Requery fahre.
    Dieses Phänomen bezeichne ich hier einmal als Trägheit des ADODataSets.

    Wenn mir jemand weiterhelfen kann wäre das meine Erlösung!

    Gruß
    Marco Thede

    P.S.: gibt es eigentlich mittlerweile ein Buch, das stärker auf Delphi mit ADO eingeht??

  • #2
    Hallo,

    zum ersten Problem: <br>
    Wenn es sich der Entwickler allzu bequem macht, muss er mit derartigen Störungen seiner Ruhe rechnen ;-) <br>
    Was passiert da? Wenn TADODataSet einen Datensatz löschen soll, wird das dahinterliegende RecordSet-Objekt (COM-Objekt von Microsoft) beauftragt, diese Aktion automatisch in eine SQL-Anweisung zu übersetzen. Wenn etwas automatisch übersetzt wird, ist es sinnvoll, eine Sicherheitsprüfung einzubauen - und diese Sicherheitsprüfung besteht in diesem Fall darin, die vom SQL Server zurückgelieferte Anzahl der <b>betroffenen Datensätze</b> auszuwerten. Das RecordSet-Objekt erwartet den Wert 1 für einen gelöschten Master-Datensatz. Wenn in der Datenbank allerdings Trigger automatisch Detail-Datensätze löschen, ist der Rückgabewert nur dann 1, wenn bei der letzten Aktion auch nur 1 Detail-Datensatz betroffen waren (der SQL Server liefert den Wert der letzten Aktion zurück). <br>
    Man könnte nun als Notbehelf in jedem Trigger die Anweisung <b>SET NOCOUNT ON</b> als erste Zeile einfügen.<br>
    Oder man stellt gleich das Design der Anwendung etwas um, indem der Datensatz über eine Stored Procedure gelöscht wird. War das erfolgreich, wird TADODataSet geschlossen/neu geöffnet, so dass sowohl in der Master- als auch in der Detail-Datenmenge aktuelle Daten vom SQL Server vorgefunden werden. Falls die Position des Datensatzes beibehalten werden muss, kann man den Primärschlüsselwert vorher sichern und den Datensatz nach dem Öffnen über DisableControls/Locate/EnableControls neu positionieren.

    zum zweiten Problem: <br>
    Hier würde ich zuerst das 2. ADO-Update (<i>d5adoupdate2.exe</i>) installieren. Falls das Problem dann immer noch auftritt, wie sieht die Verbindung zur Master-Datenmenge an einem kurzen Beispiel aus?

    zur Frage nach dem ADO-Buch: <br>
    Ich würde mir an Ihrer Stelle sowohl das MDAC-SDK besorgen (MSDN, Microsoft-Webseiten) als auch das Microsoft-Press-Buch <i>ADO Programmierung</i> (ISBN 3-86063-618-9). Dort geht es zwar nur um VB und ASP, aber das spielt keine Rolle, da alle Aussagen 1:1 auch für Delphi gelten. ADO Express ist nur ein Komponenten-Aufsatz für die nativen ADO-Objekte. <br>
    Es gibt ein ADO-Buch für Delphi, allerdings nur in englisch: <i>Advanced Delphi Developers Guide to ADO</i> (ISBN 1-55622-758-2).

    &#10

    Comment


    • #3
      Hallo,
      und vielen Dank!
      das erste Problem war in der Tat die ungeschickte Zusammenarbeit (oder besser nicht-Zusammenarbeit) vom Delete-Befehl (der übrigens auch durch ein ADOCommand mit DELETE Anweisung auftrat) und den Triggern. durch eine Serverseitige StoredProc ist der Spuk jetzt vorbei.
      Das zweite Problem war eine ungeschickte Update-Routine der Mastertabelle nach dem Insert eines Detail-Datensatzes.

      Auf jeden Fall läuft's jetzt.

      Vielen Dank noch einmal!
      Gruß
      Marco Thed

      Comment

      Working...
      X