BasicZx81
Messages postés140Date d'inscriptionsamedi 5 mars 2011StatutMembreDernière intervention13 août 2013
-
13 févr. 2012 à 21:17
BasicZx81
Messages postés140Date d'inscriptionsamedi 5 mars 2011StatutMembreDernière intervention13 août 2013
-
14 févr. 2012 à 21:23
Bonsoir, j'espère ne pas abuser en demandant une fois de plus de l'aide.
J'ai un Dataset comprenant 2 tables Parents, Enfants. Si j'ajoute simultanément 1 ligne dans la table parents et 1 ou plusieurs lignes dans la table Enfants, seul les lignes de la table parent parviennent à s'enregistrer lors de l'appel de chaque méthode Updates.
En cherchant j'ai localisé le problème mais je n'ai pas trouvé de solution :
Tout d'abord je voudrais préciser que j'enregistre mes 2 tables dans l'ordre (La table Parent puis la table Enfants, Mes 2 tables sont liées par une relation un à plusieurs)
Donc le problème se situe pendant l'exécution de la méthode Update de la table Parents, à ce moment là les lignes Enfants perdent le Statut Added, et comme je fait une sélection des lignes à enregistrer avec le Statut Added, lors de l'appel de la méthode Update pour la table Enfants il n'y a plus rien à enregistrer. (J'espère que je suis clair...)
Plus précisément ces statuts sont perdues soit juste après la méthodes AcceptChanges (voir la procédure ci-après), soit en sortant de la méthode Update si je désactive AcceptChanges.
Comment ce fait t'il que je perdent les Statuts ? Je n'y comprends plus rien. J'ai même essayé de supprimer la relation (aprés avoir ajouter les lignes dans mon Dataset), il n'y a rien à faire , ca ne fonctionne pas.
Les lignes pour enregistrer les tables dans l'ordre :
DBDataAdapterParents.Update(objDBDataSet.Tables("PARENT").Select(Nothing, Nothing, DataViewRowState.Added)) ' Cette ligne réinitialise les statuts "Added" des lignes de la tables Enfants !!!!!!!!!!!!!!
DBDataAdapterEnfants.Update(objDBDataSet.Tables("ENFANT").Select(Nothing, Nothing, DataViewRowState.Added))
Pour information la procédure qui me permet de récupérer un numéro de clé auto-incrementé issue de la base. (Celle-ci est appelé pour chaque ligne pendant l'update de la table parent).
Private Sub DBAdapterParents_RowUpdate(ByVal sender As Object, ByVal e As System.Data.OleDb.OleDbRowUpdatedEventArgs)
If e.StatementType = StatementType.Insert Then
Dim MaComRecup As New OleDb.OleDbCommand("SELECT @@IDENTITY", e.Command.Connection)
MaComRecup.Transaction = MaTransaction
e.Row.Item(ChampsE_Taches.ID_TACHE) = MaComRecup.ExecuteScalar
e.Row.AcceptChanges() ' Cette ligne réinitialise les statuts "Added" des lignes de la tables Enfants !!!!!!!!!!!
End If
End Sub
Merci de m'aider si vous pouvez, je suis vraiment embetté avec ce problème.
BasicZx81
Messages postés140Date d'inscriptionsamedi 5 mars 2011StatutMembreDernière intervention13 août 2013 14 févr. 2012 à 21:23
Bonjour, j'ai trouvé la solution. Il m'a fait transpirer le bestiaux...
Il suffit de changer la propriété AcceptRuleChange de la clé etrangere de la table Enfants à AcceptRejectRule.None le temps d'enregistrer la table Parents ensuite on peux repasser à AcceptRejetRule.Cascade et enregistrer la table Fille....Oufffff. Je suis soulagé.
Private Sub DBAdapterParents_RowUpdate(ByVal sender As Object, ByVal e As System.Data.OleDb.OleDbRowUpdatedEventArgs)
If e.StatementType = StatementType.Insert Then
Dim MaComRecup As New OleDb.OleDbCommand("SELECT @@IDENTITY", e.Command.Connection)
MaComRecup.Transaction = MaTransaction
e.Row.Item("ID_PARENT") = MaComRecup.ExecuteScalar
Dim FKCont As ForeignKeyConstraint = objDBDataSet.Tables("ENFANT").Constraints.Item(1)
With FKCont
.AcceptRejectRule = AcceptRejectRule.None
.DeleteRule = Rule.Cascade
.UpdateRule = Rule.Cascade
End With
e.Row.AcceptChanges()
End If
End Sub
PS : Je me suis mélangé les pinceaux dans mon premier poste remplacer (ChampsE_Taches.ID_TACHE) par "ID_PARENT"