Wie Datensatz Parent & Child-Tabellen mit Automatisch generierte Identitätsschlüssel aktualisieren?

StackOverflow https://stackoverflow.com/questions/931630

  •  06-09-2019
  •  | 
  •  

Frage

Ich bin mit ADO.NET Datasets in meinem VB-Anwendungen. Ich habe eine typisierte Datasets mit einem Elternteil Tisch und viele Kind-Tabellen. Ich mag Identitätsschlüssel generieren, wenn ich Daten in übergeordneter Tabelle einfügen und dann die Daten in allen untergeordneten Tabellen mit demselben Schlüssel aktualisiert (A foregin-Taste).

Endlich, möchte ich den Datensatz in der Datenbank (SQL Server08) aktualisieren.

Nun, die oben etwas möglich sein kann, indem man zuerst direkt übergeordnete Tabelle in der Datenbank einfügen, erhalten Sie die Spalte Identität und als verwenden, um für Kindertische.

Aber ich mag dies als automatischen Betrieb (wie LINQ to SQL, die Pflege von Primary & Fremdschlüsseln in Datacontext nimmt.)

ich so etwas möglich in Dataset, die für Eltern und Kind Tabellen Pflege Automatisch generierte Spalte nimmt?

Danke,

ABB

Keine korrekte Lösung

Andere Tipps

Ich denke, das sollte klar sein und sollte ohne Zwicken arbeiten. Aber dennoch, es ist ziemlich einfach.

Die Lösung besteht aus zwei Teilen:

  1. Erstellen DataRelation zwischen Kind und Eltern Tabellen und legen Sie es Updates kaskadieren auf. Auf diese Weise, wenn Eltern Id ändert, werden alle Kinder aktualisiert werden.

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId"))
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade
    
  2. Datensatz einfügen und Aktualisierungsbefehle sind Zwei-Wege: Wenn es irgendwelche Ausgangsparameter gebunden oder irgendwelche Daten zurückgegebenen Zeilen, sie werden verwendet, um Daten-Set Zeile zu aktualisieren, die das Update verursacht werden.

    Dies ist besonders nützlich für dieses spezielle Problem: immer automatisch generierte Spalten zurück zur Anwendung. Neben Identität könnte dies beispielsweise eine Timestamp-Spalte. Aber Identität ist sehr nützlich.

    Alles, was wir tun müssen, ist gesetzt Einsatzbefehl Identität zurückzukehren. Es gibt mehr Möglichkeiten, es zu tun, zum Beispiel:

    a) Unter Verwendung gespeicherte Prozedur mit Ausgabeparametern. Dies ist die tragbare Art und Weise unter „echten“ Datenbanken.

    b) mehrere SQL-Anweisungen, mit einer letzten eingefügten Zeile zurückkehrt. Dies ist AFAIK spezifisch für SQL Server, aber die einfachste:

    insert into Parent (Col1, Col2, ...) values (@Col1, @Col2, ...);
    select * from Parent where Id = SCOPE_IDENTITY();
    

Danach up Einstellung, alles, was Sie tun müssen, um übergeordnete Zeilen mit Ids zu schaffen, die einzigartig sind (innerhalb einzelner Datensatz) aber nicht in der Datenbank. Negative Zahlen sind in der Regel eine gute Wahl. Dann, wenn Sie Daten-Set Änderungen an Datenbank speichern, werden alle neuen übergeordneten Zeilen werden echte Ids aus der Datenbank erhalten.


Hinweis: Wenn Sie mit Datenbank ohne mehr Anweisungen unterstützt und ohne gespeicherte Prozeduren (z Access) passieren zu arbeiten, müssen Sie Setup-Event-Handler auf RowUpdated Ereignisse in übergeordneter Tabelle Adapter. Im hanler müssen Sie Identität mit select @@IDENTITY Befehl erhalten.


Einige Verbindungen:

Paar Dinge zu zeigen.

  1. Ja, Sie auf jeden Fall die Beziehungen müssen für beide Tabellen zugeordnet. Sie können von XSD-Editor überprüfen (Doppel Ihrer XSD-Datei klicken). Standardmäßig wird die Beziehung als ‚Beziehung nur‘ gesetzt, die keine ‚Update-Regel‘ nicht hat. Bearbeiten Sie diese Beziehung, indem Sie in ‚Bearbeiten Relation‘ und wählen ‚Foreign Key Constraint Nur‘ oder ‚Beide ~~~‘ ein. Und müssen ‚Update-Regel‘ als Kaskade setzen! 'Regel löschen' ist bis zu Ihnen.

  2. Wenn Sie nun eine neue übergeordnete Tabellenzeile der ID verwenden (AutoIncrement) für neue Kind Tabellenzeilen als Fremdschlüssel, Sie haben zunächst die übergeordnete Zeile in der Tabelle zu erstellen, bevor Sie die neue ID Eltemzeile die um verwenden.

  3. Sobald Sie Update für die übergeordnete Tabelle rufen Table verwenden, wird die zugehörige untergeordnete Tabelle der neue Zeile automatisch zu korrigieren parentID hat.

Mein einfacher Code-Schnipsel:

'--- Make Parent Row
Dim drOrder as TOrderRow = myDS.TOder.NewTOrderRow
drOrder.SomeValue = "SomeValue"
myDS.TOrder.AddTOrderRow(drOrder) '===> THIS SHOULD BE DONE BEFORE CHILD ROWS

'--- Now Add Child Rows!!! there are multiple ways to add a row into tables....
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailValue1")
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailvalue2")
'....
'....

'--- Update Parent table first
myTableAdapterTOrder.Update(myDS.TOrder)
'--- As soon as you run this Update above for parent, the new parent row's AutoID(-1)
'--- will become real number given by SQL server. And also new rows in child table will
'--- have the updated parentID

'--- Now update child table
myTableAdapterTOrderDetail.Update(myDS.TOrderDetail)

Ich hoffe, es hilft!

Und wenn Sie nicht wollen, Datensätze verwenden und dennoch den IDs zu Childs zugewiesen bekommen und bekommen die IDs, so dass Sie Ihr Modell aktualisieren: https://danielwertheim.wordpress.com/2010/10/ 24 / c-Batch-Identität-Einsätze /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top