(1) Prologue
Lorsque le DataSet contient à la fois des tables primaires/sous-tables (tables de clés primaires/tables de clés étrangères), les contraintes relationnelles sont parfois trop strictes :
Par exemple, les règles d'intégrité des bases de données relationnelles :
1. Intégrité de l'entité. La clé primaire dans la table de clés primaires ne doit pas être vide.
2. Intégrité référentielle. La valeur de la clé étrangère dans la table des clés étrangères doit correspondre à la clé primaire dans la table des clés primaires.
Soit vide, soit une valeur de clé primaire dans la table de clé primaire.
3. Personnalisez l’intégrité.
Si les contraintes de relation multi-tables définies dans la table DataSet sont trop strictes, utilisez directement la méthode Update.
Lors de la soumission simultanée de plusieurs tables dans un DataSet, les règles d'intégrité peuvent ne pas être respectées et une erreur peut se produire.
Raison : Par exemple, configurez deux tables : CompanyMain (table principale de l'entreprise) et CompanySon (sous-table de l'entreprise).
CompanyMain (table principale de l'entreprise) stocke principalement les informations de base d'une entreprise, CompanySon (sous-table de l'entreprise)
Il stocke principalement des informations sur certains clients de cette entreprise. Et (ID) dans la table principale de l'entreprise et (BelongID) dans la sous-table.
Établissez une association, c'est-à-dire une relation de clé primaire et étrangère ; une entreprise correspond à plusieurs clients, c'est-à-dire une relation ID:BelongID = 1:n.
L'ID de la table principale est un numéro généré automatiquement.
Donc:
Lors de la soumission conjointe de la nouvelle interface de l'entreprise, le système ne respectera pas les « règles d'intégrité de la base de données » pour mettre à jour la base de données.
S'il met d'abord à jour la sous-table, puis la table principale, une erreur peut être signalée. La raison est que les informations sur l'entreprise dans la table principale n'ont pas encore été insérées.
Pour la table de la base de données, le numéro d'entreprise : ID n'est pas généré et il n'y aura pas de BelongID correspondant lors de la mise à jour de la sous-table.
À ce stade, si la règle d'intégrité « La clé étrangère dans la table de clé étrangère n'est pas nulle » est définie, une exception sera levée.
Il s'agit simplement d'une possibilité d'erreur, il y a plus de possibilités d'erreur et de telles erreurs sont plus susceptibles de se produire dans une conception distribuée
(2). La solution
suit généralement les règles suivantes, ce qui évitera un grand nombre de risques d'erreur
1
.Règle. Avant de mettre à jour le DataSet, effectuez une soumission fractionnée par <table> et <attribut RowState de la table>
I. Effectuez une soumission fractionnée par <table> signifie :
les tables du DataSet ne sont pas soumises ensemble, mais soumises une à la fois. Table, soumettre plusieurs fois
II. Diviser la soumission selon <l'attribut RowState de la table> signifie :
diviser une seule table dans le DataSet selon l'attribut RowState,
soumettre le même RowState une fois et soumettre plusieurs fois
2. Règles
basées sur la règle
.1, mettez d'abord à jour le statut de <new> et <modified>, puis mettez à jour le <deleted>
C'est-à-dire : mettez d'abord à jour la valeur DataRowState : Ajouté et Modifié, puis mettez à jour : Supprimé
3.
Basé sur la règle 1 et la règle
.2, si DataRowState est ajouté et modifié, la table principale est mise à jour en premier, puis la sous-table est mise à jour en fonction des règles
1 et 2, si DataRowState est supprimé, la sous-table est mise à jour en premier, puis la sous-table. La sous-table est mise à jour.Mettez à jour la table principale.
(3) Résumez les trois règles ci-dessus comme suit :
1. Divisez la table dans le DataSet, regroupez chaque enregistrement de table en fonction de RowState et stockez-le dans différents ensembles de données
// Cela devrait être. stocké dans le DataSet, en effet : Update accepte les paramètres de DataSet et WebService ne prend en charge que
//DataSetExemple de code
pour l'opération de sérialisation
:Supposons que l'ensemble de données à mettre à jour est : dsCompany (qui comprend deux tables, la table principale. et la sous-table) table, et stocke
les données, à mettre à jour)
//dtCompanyMain stocke les informations de la table principale de l'entreprise, dtCompanySon stocke les informations de la sous-table de l'entreprise
DataTable dtCompanyMail = ds.Tables["dtCompanyMain"].Clone(); //Séparez les données de la table principale
et stockez un autre objet
DataTable dtCompanySon = ds.Talbes[ "dtCompanySon"].Clone(); //Séparez les données de la sous-table
et stockez un autre objet
DataSet dsAdded = new DataSet( //Stockez les données nouvellement ajoutées de la table principale
DataSet dsMidified = new DataSet(); Stockage de l'enregistrement de ligne modifié par la table principale
DataSet dsDeleted = new DataSet(); //Stockage de l'enregistrement de ligne supprimé de la table principale
dsAdded = dtCompanyMain.GetChanges(DataRowState.Added); //Obtenir le nouvel
enregistrement de ligne défini
dans la table principaledsMidified = dtCompanyMain.GetChanges (DataRowState.Modified); //Obtenir le jeu d'enregistrements de ligne
modifié
dans la table principale dsDeleted = dtCompanyMain.GetChanges(DataRowState.Deleted); //Obtenirle jeu d'enregistrements de ligne
supprimé dans la table principale
2. Mettre à jour l'état de DataRowState. de la table principale vers : Enregistrements ajoutés et modifiés
SqlDataAdapter.Update(dsAdded,"dtCompanyMain"); //Mettre à jour le jeu d'enregistrements ajouté à la base de données
SqlDataAdapter.Update(dsModified,"dtCompanyMain"); à
la base de données
3. Mettre à jour l'état de la sous-table DataRowState est : enregistrements ajoutés et modifiés
... //Code omis, similaire à la mise à jour de 2 tables principales
4. Mettre à jour l'état de la sous-table DataRowState : enregistrements supprimés
. .... // Code omis, similaire à 5 ci-dessous
5. Mettez à jour le statut DataRowState de la table principale comme suit : Enregistrements supprimés
SqlDataAdapter.Update(dsDeleted, "dtCompanyMain"); // Mettez à jour l'ensemble d'enregistrements modifié dans la base de données;
Merci d'avoir lu!