(1) Prolog
Wenn das DataSet sowohl Primär- als auch Untertabellen (Primärschlüsseltabellen/Fremdschlüsseltabellen) enthält, sind die Beziehungsbeschränkungen manchmal zu streng:
Zum Beispiel Integritätsregeln für relationale Datenbanken:
1. Entitätsintegrität Der Primärschlüssel in der Primärschlüsseltabelle darf nicht leer sein.
2. Referenzielle Integrität. Der Wert des Fremdschlüssels in der Fremdschlüsseltabelle muss dem Primärschlüssel in der Primärschlüsseltabelle entsprechen.
Entweder leer oder ein Primärschlüsselwert in der Primärschlüsseltabelle.
3. Passen Sie die Integrität an.
Wenn die in der DataSet-Tabelle definierten Einschränkungen für Mehrtabellenbeziehungen zu streng sind, verwenden Sie direkt die Update-Methode.
Wenn mehrere Tabellen in einem DataSet zusammen übermittelt werden, werden die Integritätsregeln möglicherweise nicht eingehalten und es kann ein Fehler auftreten.
Grund: Richten Sie beispielsweise zwei Tabellen ein: CompanyMain (Haupttabelle des Unternehmens) und CompanySon (Untertabelle des Unternehmens).
CompanyMain (Haupttabelle des Unternehmens) speichert hauptsächlich die grundlegenden Informationen eines Unternehmens, CompanySon (Untertabelle des Unternehmens).
Es speichert hauptsächlich Informationen über einige Kunden dieses Unternehmens und (ID) in der Haupttabelle des Unternehmens und (BelongID) in der Untertabelle
Stellen Sie eine Zuordnung her, d. h. eine Primär- und Fremdschlüsselbeziehung; ein Unternehmen entspricht mehreren Kunden, d. h. eine ID:BelongID = 1:n-Beziehung.
Die ID der Haupttabelle ist eine automatisch generierte Nummer.
Also:
Bei der gemeinsamen Übermittlung der neuen Unternehmensschnittstelle beachtet das System nicht die „Datenbankintegritätsregeln“, um die Datenbank zu aktualisieren.
Wenn zuerst die Untertabelle und dann die Haupttabelle aktualisiert werden, wird möglicherweise ein Fehler gemeldet. Der Grund dafür ist, dass die Firmeninformationen in der Haupttabelle noch nicht eingefügt wurden.
Für die Tabelle in der Datenbank wird die Firmennummer: ID nicht generiert und es gibt keine entsprechende BelongID, wenn die Untertabelle aktualisiert wird.
Wenn zu diesem Zeitpunkt die Integritätsregel „Der Fremdschlüssel in der Fremdschlüsseltabelle ist nicht null“ festgelegt ist, wird eine Ausnahme ausgelöst.
Dies ist nur eine Fehlermöglichkeit, es gibt mehr Fehlermöglichkeiten und es ist wahrscheinlicher, dass solche Fehler im verteilten Design auftreten
(2). Die Lösung
folgt im Allgemeinen den folgenden Regeln,wodurch
eine große Anzahl von Fehlermöglichkeiten vermieden wird
Regel: Führen Sie vor dem Aktualisieren des DataSet eine geteilte Übermittlung nach <table> und <RowState-Attribut der Tabelle> durch.
I. Führen Sie eine geteilte Übermittlung nach <table> durch:
Die Tabellen im DataSet werden nicht zusammen, sondern einzeln übermittelt. Tabelle, mehrfach einreichen
II. Übermittlung gemäß <RowState-Attribut der Tabelle> aufteilen bedeutet:
Eine einzelne Tabelle im DataSet gemäß dem RowState-Attribut aufteilen,
denselben RowState einmal übermitteln und mehrmals übermitteln.
2. Regeln
basierend auf der Regel 1, aktualisieren Sie zuerst den Status von <neu> und <geändert> und aktualisieren Sie dann den Wert von <gelöscht>.
Das
heißt: Aktualisieren Sie zuerst den DataRowState-Wert: Hinzugefügt und geändert und dann aktualisieren Sie:
Gelöscht
2, wenn DataRowState hinzugefügt und geändert wird, wird zuerst die Haupttabelle und dann die Untertabelle aktualisiert. Basierend auf Regel
1 und Regel 2, wenn DataRowState gelöscht wird, wird zuerst die Untertabelle aktualisiert Untertabelle wird aktualisiert.
(3) Fassen Sie die oben genannten drei Regeln wie folgt zusammen:
1. Teilen Sie die Tabelle im DataSet auf, gruppieren Sie jeden Tabellendatensatz nach RowState und speichern Sie ihn in verschiedenen
Datensätzen im DataSet gespeichert. Dies liegt daran, dass Update die Parameter von DataSet akzeptiert und WebService nur //DataSet unterstützt
.Codebeispiel
für den Serialisierungsvorgang
:Angenommen, der zu aktualisierende Datensatz ist: dsCompany (einschließlich zwei Tabellen, der Haupttabelle). und die Untertabelle) Tabelle und speichert
Daten, die aktualisiert werden sollen)
//dtCompanyMain speichert Informationen zur Haupttabelle des Unternehmens, dtCompanySon speichert Informationen zur Untertabelle des Unternehmens
DataTable dtCompanyMail = ds.Tables["dtCompanyMain"].Clone(); //Trennen Sie die Daten der Haupttabelle
und speichern Sie ein anderes Objekt
DataTable dtCompanySon = ds.Talbes[ "dtCompanySon"].Clone(); //Separate die Untertabellendaten
und speichere ein anderes Objekt
DataSet dsAdded = new DataSet(//Speichere die neu hinzugefügten Daten der Haupttabelle
DataSet dsMidified(); Den in der Haupttabelle bearbeiteten Zeilendatensatz speichern.
DataSet dsDeleted = new DataSet(); //
Den in der Haupttabelle gelöschten
Zeilendatensatz
speichern
dtCompanyMain.GetChanges (DataRowState.Modified); // Den in der Haupttabelle
bearbeiteten
Zeilendatensatz abrufen dsDeleted = dtCompanyMain.GetChanges(DataRowState.Deleted); // Denin der Haupttabelle gelöschten
Zeilendatensatz
abrufen2. Den DataRowState-Status aktualisieren der Haupttabelle zu: Hinzugefügte und
geänderte
Datensätze zur
Datenbank
3. Status der Untertabelle DataRowState aktualisieren: Hinzugefügte und geänderte Datensätze
... //Code weggelassen, ähnlichwie
bei 2 Aktualisierung der Haupttabelle
4. Status der Untertabelle DataRowState aktualisieren: Gelöschte Datensätze.
.... // Code weggelassen, ähnlich 5 unten
5. Aktualisieren Sie den DataRowState-Status der Haupttabelle auf: Gelöschte Datensätze
SqlDataAdapter.Update(dsDeleted, "dtCompanyMain"); Aktualisieren Sie den geänderten Datensatz in der Datenbank
Danke fürs Lesen!