Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   .NET-Framework (managed code) (https://www.delphipraxis.net/79-net-framework-managed-code/)
-   -   C#, Dataset: Ich bekomme Cascaded Inserts nicht hin (https://www.delphipraxis.net/168528-c-dataset-ich-bekomme-cascaded-inserts-nicht-hin.html)

Furtbichler 27. Mai 2012 10:07

C#, Dataset: Ich bekomme Cascaded Inserts nicht hin
 
Hi,

Ich habe ein Dataset, und zwei Tabellen (Master, Detail).
Master = [PK MasterID]
Detail = [PK DetailID, FK MasterID]

Beide Primary keys sind Autoincrements.

Ich habe in Visual Studio ein Dataset mit den beiden Tabellen angelegt und die FK-Relation so eingestellt, das kaskadiertes Insert und Update aktiviert sind. Das Dataset ist auf 'HierarchicalUpdates=true' eingestellt.

Wenn ich zu einem existierenden Master ein paar Details hinzufüge, klappt es, d.h. beim Neuanlegen wird automatisch die MasterID befüllt, die DetailID bekommt zunächst einen negativen Wert und nach dem Speichern wird diese ID mit dem echten PK befüllt.

Wenn ich einen neuen Master einfüge und dann sofort Details erstelle, dann bekommen die Details korrekterweise die temporäre negative MasterID sowie ihre eigene temporäre negative DetailID. Soweit ist alles ok.

Nun muss das Zeugs in die Datenbank geschrieben werden:
Ich schaffe es einfach nicht, das erst der Master eingefügt wird, dessen neue ID automatisch in die Details überführt wird und dann die Details ihrerseits gespeichert werden.

Angeblich reicht es, "TableAdapterManager.UpdateAll()" aufzurufen, nur dann bekomme ich einen DBConcurrencyException im UpdateCommand. Und das, obwohl ich ein InsertCommand erwarte. Ich habe doch neue Datensätze hinzugefügt.

Wenn ich "MasterTableAdapter.Update(MyDataset.DetailTab le)" aufrufe, dann speichert er den neuen Master und ersetzt die temporären negativen MasterIDs in den Detaildatensätzen korrekterweise durch die neue ID. Super.... Aber die Details bekomme ich dann einfach nicht gespeichert: Ich bekomme den gleichen Fehler.

Wie verdammt krieg ich das hin, ohne ellenlangen Code zu schreiben. Das muss doch gehen!

PS: Eine "Lösung" wäre, jeden neuen Master sofort zu speichern, aber das ist keine Lösung, sondern ein Workaround. Daran bin ich nicht interessiert.

Phoenix 27. Mai 2012 11:23

AW: C#, Dataset: Ich bekomme Cascaded Inserts nicht hin
 
Hast Du in Deinem Dataset die Relation auch korrekt eingetragen?
Konkret geht es hier um die DataTableConstraint (ForeignKeyConstraint - http://msdn.microsoft.com/en-us/library/st1t2c35.aspx ) zwischen der Master- und der Detail-Table in Deinem Dataset und der DataRelation ( http://msdn.microsoft.com/en-us/libr...arelation.aspx ) zwischen den Tabellen im allgemeinen.

Die DataColumn der PK-Spalte in Deiner Master-Table muss auch Cascading updates gesetzt haben, um die neue ID von der Datenbank auch an die Detail-Sätze weiterzugeben.

Theoretisch sollte das aber der TableAdapter vollautomatisch setzen. Nutzt Du den nicht?
Hier gibts noch ein paar Beispiele was man ansonsten manuell machen muss um das zum laufen zu bringen: http://msdn.microsoft.com/en-us/library/ks9f57t0.aspx

Furtbichler 27. Mai 2012 11:46

AW: C#, Dataset: Ich bekomme Cascaded Inserts nicht hin
 
Hallo Phoenix,

Ich habe Visual Studio einfach gesagt: Nimm die Datenbank (die Foreign keys sind korrekt drin). Danach habe ich in Visual Studio in der FK-Relation noch die kaskadierten Updates und Deletes eingetragen. Sonst nichts.

Speichern wird mit 'TableAdapterManager.UpdateAll' gemacht, was aber nicht funktioniert.
Wie sähe das Speichern mit den Adaptern aus?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz