none
Master-Child / Relation / Seed / Step RRS feed

  • Frage

  • Hallo zusammen,

    spiele gerade ein Bisschen mit dem Designer rum und dabei ist anhand eines Beispiels (Master-Child Ansicht über zwei Grids für zwei zugrundeliegende Tabellen mit Relation) folgend Frage entstanden:

    Neuer DS im Master Grid + neuer DS im Child und erst dann TableAdapter.Update führt zu Contraint Verletzung (wenn AutoIncrementSeed und AutoincrementStep beide auf "-1" stehen). Denke, weil der PK im Master und der FK im Child ja noch "temporär" sind und die Zuordnung eigentlich erst nach dem Speichern von Master erzeugt werden kann, oder?

    Wie lässt sich eine solche Situation lösen? Im Prinzip müsste man ja erst den Master DS speichern (damit der seinen "richtigen" PK erhält) und danach im noch nicht gespeicherten Child DS diesen als FK setzen. Nur, wenn der Master DS gespeichert wird (und den PK bekommt), dann geht der noch nicht gespeicherte Child DS "verloren"...

    Hat das "-1" eigentlich wirkliche Vorteile? habe gerade mal getestet mit "+1": Neue DataRow über das Grid erzeugt und es steht "50" in der PK Spalte. Dann direkt in der Datenbank einen DS manuell erzeugt und danach ein MasterDataTable.Update gemacht und es gab keine Fehler, es ist eine 51 erzeugt worden...

    Grüße, Jan

    Freitag, 28. Januar 2011 23:25

Antworten

  • Hi Jan,
    die negativen Autowerte bei neuen Datensätzen im Client haben einen sehr
    tiefen Sinn. So kollidieren nicht mit vorhandenen Datensätzen, vor allem mit
    Datensätzen, die zwischenzeitlich andere Nutzer in die Datenbank geschrieben
    haben. Stell Dir vor, du holst nur ein paar Datensätze und fügst im Client
    einen neuen Datensatz hinzu. Ein positiver Autowert kann kollidieren mit den
    Werten in der Datenbank, auch wenn vielleicht zum Zeitpunkt der Erstellung
    des neuen Datensatzes dieser Wert noch nicht vergeben war. Zwischenzeitlich
    können andere Nutzer neue Datensätze hinzugefügt haben.
     
    Wichtig bei negativen Autowerten im Client ist, dass der Datenbankserver
    beim Schreiben den aktuellen Autowert vergibt und dieser sofort in den
    Client zurückgelesen wird. Wenn dieser neue Wert im Datensatz den negativen
    alten Wert überschreibt, so werden bei Aktualisierungsweitergabe auch die
    Fremdschlüsselwerte in den Kind-Datensätzen aktualisiert. Wenn keine
    Aktualisierungsweitergabe eingestellt ist, muss das per Programm gemacht
    werden.
     
    Es gibt also bei richtigen Einstellungen bzw. bei richtiger Programmierung
    keine Probleme.
     
    Zusätzlich noch die Reihenfolge beim Aktualisieren der Datensätze in der
    externen Datenbank zu beachten:
     
    New Master
    New Child
    Update Master
    Update Child
    Delete Child
    Delete Master
     
    --
    Viele Grüße
    Peter
     
     
    Montag, 31. Januar 2011 14:26

Alle Antworten

  • Hat das "-1" eigentlich wirkliche Vorteile? habe gerade mal getestet mit "+1": Neue DataRow über das Grid erzeugt und es steht "50" in der PK Spalte. Dann direkt in der Datenbank einen DS manuell erzeugt und danach ein MasterDataTable.Update gemacht und es gab keine Fehler, es ist eine 51 erzeugt worden...

    Ups, stimmt gar nicht was ich da geschrieben habe. Verguckt bzw. in den Tabellen vertan, sorry...

    Freitag, 28. Januar 2011 23:39
  • Ups, stimmt gar nicht was ich da geschrieben habe. Verguckt bzw. in den Tabellen vertan, sorry...

    Wobei ich damit natürlich nur den letzten Abschnitt meinte...

    Das eigentliche Problem besteht weiterhin und es würde mich interessieren, wie man das lösen kann bzw. ob sich das überhaupt lösen lässt, wenn AutoincrementStep und AutoincrementSeed auf "-1" stehen...?

    Montag, 31. Januar 2011 08:55
  • Hi Jan,
    die negativen Autowerte bei neuen Datensätzen im Client haben einen sehr
    tiefen Sinn. So kollidieren nicht mit vorhandenen Datensätzen, vor allem mit
    Datensätzen, die zwischenzeitlich andere Nutzer in die Datenbank geschrieben
    haben. Stell Dir vor, du holst nur ein paar Datensätze und fügst im Client
    einen neuen Datensatz hinzu. Ein positiver Autowert kann kollidieren mit den
    Werten in der Datenbank, auch wenn vielleicht zum Zeitpunkt der Erstellung
    des neuen Datensatzes dieser Wert noch nicht vergeben war. Zwischenzeitlich
    können andere Nutzer neue Datensätze hinzugefügt haben.
     
    Wichtig bei negativen Autowerten im Client ist, dass der Datenbankserver
    beim Schreiben den aktuellen Autowert vergibt und dieser sofort in den
    Client zurückgelesen wird. Wenn dieser neue Wert im Datensatz den negativen
    alten Wert überschreibt, so werden bei Aktualisierungsweitergabe auch die
    Fremdschlüsselwerte in den Kind-Datensätzen aktualisiert. Wenn keine
    Aktualisierungsweitergabe eingestellt ist, muss das per Programm gemacht
    werden.
     
    Es gibt also bei richtigen Einstellungen bzw. bei richtiger Programmierung
    keine Probleme.
     
    Zusätzlich noch die Reihenfolge beim Aktualisieren der Datensätze in der
    externen Datenbank zu beachten:
     
    New Master
    New Child
    Update Master
    Update Child
    Delete Child
    Delete Master
     
    --
    Viele Grüße
    Peter
     
     
    Montag, 31. Januar 2011 14:26
  • Hi Peter,

    danke der Antwort.

    die negativen Autowerte bei neuen Datensätzen im Client haben einen sehr tiefen Sinn. So kollidieren nicht mit vorhandenen Datensätzen, vor allem mit
    Datensätzen, die zwischenzeitlich andere Nutzer in die Datenbank geschrieben
    haben. Stell Dir vor, du holst nur ein paar Datensätze und fügst im Client einen neuen Datensatz hinzu. Ein positiver Autowert kann kollidieren mit den
    Werten in der Datenbank, auch wenn vielleicht zum Zeitpunkt der Erstellung des neuen Datensatzes dieser Wert noch nicht vergeben war. Zwischenzeitlich können andere Nutzer neue Datensätze hinzugefügt haben.

    Dass die negativen Werte Sinn machen bzw. welchen war mir schon bewusst, das wollte ich nicht anzweifeln. Das ist wirklich eine prima Sache.
     > Wichtig bei negativen Autowerten im Client ist, dass der Datenbankserver

    beim Schreiben den aktuellen Autowert vergibt und dieser sofort in den Client zurückgelesen wird. Wenn dieser neue Wert im Datensatz den negativen alten Wert überschreibt, so werden bei Aktualisierungsweitergabe auch die Fremdschlüsselwerte in den Kind-Datensätzen aktualisiert. Wenn keine Aktualisierungsweitergabe eingestellt ist, muss das per Programm gemacht werden.
    Es gibt also bei richtigen Einstellungen bzw. bei richtiger Programmierung keine Probleme.

    O.K., mit "Beziehungs- als auch Fremdschlüsseleinschränkung" als jeweils "Cascade" im DataSet funktioniert es.

    Allerdings werden diese Regeln beim automatischen Erzeugen des DataSets via Designer aus dem SQL Server scheinbar nicht übernommen, oder gibt es dafür irgendwo eine Einstellung? Die Beziehungen stehen standardmäßig auf "Nur Beziehung", obwohl als sie als "Insert and Update Specification" auf "Cascade" gestellt sind in der DB.
     > Zusätzlich noch die Reihenfolge beim Aktualisieren der Datensätze in der

    externen Datenbank zu beachten:
     
    New Master
    New Child
    Update Master
    Update Child

    Ja, und zusätzlich muss das "Füllen" / neu-Laden der einzelen DataTables danach auch in der richtigen Reihenfolge erfolgen, also erst Master.Fill(), dann Child.Fill(). Das hatte ich zunächst nicht beachtet, und mich gewundert, warum alles mit richtigen FKs in der DB gespeichert wurde, beim anschließenden neu-Laden aus der DB aber "verschwand" bzw. nichts mehr im Grid angezeigt wurde ;)

    Grüße, Jan

    Montag, 31. Januar 2011 20:56