Benutzer mit den meisten Antworten
Master-Child / Relation / Seed / Step

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
Antworten
-
Hi Jan,die negativen Autowerte bei neuen Datensätzen im Client haben einen sehrtiefen Sinn. So kollidieren nicht mit vorhandenen Datensätzen, vor allem mitDatensätzen, die zwischenzeitlich andere Nutzer in die Datenbank geschriebenhaben. Stell Dir vor, du holst nur ein paar Datensätze und fügst im Clienteinen neuen Datensatz hinzu. Ein positiver Autowert kann kollidieren mit denWerten in der Datenbank, auch wenn vielleicht zum Zeitpunkt der Erstellungdes neuen Datensatzes dieser Wert noch nicht vergeben war. Zwischenzeitlichkönnen andere Nutzer neue Datensätze hinzugefügt haben.Wichtig bei negativen Autowerten im Client ist, dass der Datenbankserverbeim Schreiben den aktuellen Autowert vergibt und dieser sofort in denClient zurückgelesen wird. Wenn dieser neue Wert im Datensatz den negativenalten Wert überschreibt, so werden bei Aktualisierungsweitergabe auch dieFremdschlüsselwerte in den Kind-Datensätzen aktualisiert. Wenn keineAktualisierungsweitergabe eingestellt ist, muss das per Programm gemachtwerden.Es gibt also bei richtigen Einstellungen bzw. bei richtiger Programmierungkeine Probleme.Zusätzlich noch die Reihenfolge beim Aktualisieren der Datensätze in derexternen Datenbank zu beachten:New MasterNew ChildUpdate MasterUpdate ChildDelete ChildDelete Master--Viele GrüßePeter
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 16. Februar 2011 13:43
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...
-
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...?
-
Hi Jan,die negativen Autowerte bei neuen Datensätzen im Client haben einen sehrtiefen Sinn. So kollidieren nicht mit vorhandenen Datensätzen, vor allem mitDatensätzen, die zwischenzeitlich andere Nutzer in die Datenbank geschriebenhaben. Stell Dir vor, du holst nur ein paar Datensätze und fügst im Clienteinen neuen Datensatz hinzu. Ein positiver Autowert kann kollidieren mit denWerten in der Datenbank, auch wenn vielleicht zum Zeitpunkt der Erstellungdes neuen Datensatzes dieser Wert noch nicht vergeben war. Zwischenzeitlichkönnen andere Nutzer neue Datensätze hinzugefügt haben.Wichtig bei negativen Autowerten im Client ist, dass der Datenbankserverbeim Schreiben den aktuellen Autowert vergibt und dieser sofort in denClient zurückgelesen wird. Wenn dieser neue Wert im Datensatz den negativenalten Wert überschreibt, so werden bei Aktualisierungsweitergabe auch dieFremdschlüsselwerte in den Kind-Datensätzen aktualisiert. Wenn keineAktualisierungsweitergabe eingestellt ist, muss das per Programm gemachtwerden.Es gibt also bei richtigen Einstellungen bzw. bei richtiger Programmierungkeine Probleme.Zusätzlich noch die Reihenfolge beim Aktualisieren der Datensätze in derexternen Datenbank zu beachten:New MasterNew ChildUpdate MasterUpdate ChildDelete ChildDelete Master--Viele GrüßePeter
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 16. Februar 2011 13:43
-
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 Datenbankserverbeim 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 derexternen Datenbank zu beachten:
New Master
New Child
Update Master
Update ChildJa, 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