2009-05-31 9 views
6

Ich verwende ADO.NET-Datasets in meinen VB-Anwendungen. Ich habe ein typisiertes Dataset mit einer übergeordneten Tabelle und vielen untergeordneten Tabellen. Ich möchte Identitätsschlüssel generieren, wenn ich Daten in die übergeordnete Tabelle einfüge und dann die Daten in allen untergeordneten Tabellen mit demselben Schlüssel (wie Vormerktaste) aktualisiere.Wie aktualisiere ich Eltern- und Kindtabellen mit automatisch generiertem Identitätsschlüssel?

Endlich möchte ich das Dataset in Datenbank (SQL Server08) aktualisieren.

Nun, das oben genannte Ding kann möglich sein, indem zuerst Elterntabelle in der Datenbank direkt eingefügt wird, die Identity Spalte und dann für Child Tabellen verwendet wird.

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

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

Danke,

ABB

Antwort

4

Ich denke, das sollte mehr offensichtlich sein und sollte ohne jede Feinabstimmung funktionieren. Aber trotzdem ist es 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 werden alle untergeordneten Elemente aktualisiert, wenn sich die übergeordnete ID ändert.

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId")) 
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade 
    
  2. Datensatz Einfügungs- und Aktualisierungsbefehle sind Zwei-Wege: Wenn es irgendwelche Ausgangsparameter gebunden oder irgendwelche Datenzeilen zurückgegeben, sie verwendet werden Datensatzes Zeile zu aktualisieren, die die Aktualisierung verursacht wird.

    Dies ist am nützlichsten für dieses spezielle Problem: automatisch generierte Spalten zurück zur Anwendung zu bekommen. Abgesehen von der Identität könnte dies beispielsweise eine Timestamp-Spalte sein. Aber Identität ist am nützlichsten.

    Alles, was wir tun müssen, ist den Befehl zum Einfügen, um die Identität zurückzugeben. Es gibt mehrere Möglichkeiten, dies zu tun, z. B .:

    a) Gespeicherte Prozedur mit Ausgabeparameter verwenden. Dies ist der portabelste Weg unter "echten" Datenbanken.

    b) Mehrere SQL-Anweisungen verwenden, wobei die letzte die eingefügte Zeile zurückgibt. 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, ist Elternzeilen mit Id s zu schaffen, die einzigartig sind (innerhalb einzelner Datensatz) aber unmöglich in die Datenbank. Negative Zahlen sind normalerweise eine gute Wahl.Wenn Sie dann die Datensatzänderungen in der Datenbank speichern, erhalten alle neuen übergeordneten Zeilen echte Id s aus der Datenbank.


Hinweis: Wenn Sie mit Datenbank ohne mehr Anweisungen unterstützt und ohne gespeicherte Prozeduren (z Access) passieren zu arbeiten, können Sie Ereignishandler Setup auf RowUpdated Ereignis in übergeordneter Tabelle Adapter benötigen. Im heller müssen Sie sich mit select @@IDENTITY Befehl identifizieren.


Einige Links:

3

Paar Dinge hinweisen zu.

  1. Ja, Sie müssen auf jeden Fall Beziehungen für beide Tabellen zugewiesen. Sie können dies über den xsd-Editor überprüfen (doppelklicken Sie auf Ihre xsd-Datei). Standardmäßig wird die Relation als 'nur Relation' definiert, die keine 'Update-Regel' enthält. Bearbeiten Sie diese Beziehung, indem Sie in "Beziehung bearbeiten" gehen und "Nur für Fremdschlüsseleinschränkung" oder "Beide ~~~" auswählen. Und muss "Update Rule" als Cascade festlegen! 'Regel löschen' liegt bei Ihnen.

  2. Wenn Sie nun die ID einer neuen übergeordneten Tabellenzeile (AutoIncrement) für neue untergeordnete Tabellenzeilen als Fremdschlüssel verwenden, müssen Sie zuerst die übergeordnete Zeile in die Tabelle einfügen, bevor Sie die ID der neuen übergeordneten Zeile verwenden.

  3. Sobald Sie Update für die Elterntabelle mit tableadapter aufrufen, haben die neuen Zeilen der verknüpften untergeordneten Tabelle die richtige parentID AUTOMATISCH.

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!

Verwandte Themen