Je suis en train de me mettre à ADO.NET. Mon premier code consiste à importer dans une base Access un fichier csv
Dans le csv, nous avons deux colonnes, un parent et un enfant sachant que la relation est n,n c'est à dire qu'on enfant peut avoir plusieurs parents et un parent peut avoir plusieurs enfants.
Dans ma base de données, j'ai donc trois tables:
- Enfant:
enfant_id
enfant_libelle
- Parent:
parent_id
parent_libelle
- Relation
enfant_id
parent_id
Coté code c#, j'ai un dataset dans lequel je mets chacune des tables de la base. Je remplis ensuite le dataset en mode déconnecté et je mets à jour la base à la fin.
Comme je ne connais pas d'avance l'état des numéroauto pour les id, dans les datatable de mon dataset, j'ai défini les AutoIncrementSeed et AutoIncrementStep à -1.
Je parcours tout mon csv et pour chaque ligne
- si l'enfant est connu, je récupère son id, sinon je le crée
- si le parent est connu, je récupère son id, sinon je le crée
- je crée une relation entre les deux.
Donc tous les enfants et parents créés sont numérotés avec des id négatifs
Lorsque je mets la base à jour, les nouveaux enfants et parents remontent correctement en base mais il existe une mécanique dans ADO.NET qui fait que ma datatable de relation, avant d'être flushée en base, devrait se mettre à jour en fonction des nouveaux id attribués par la base aux nouveaux parents et enfants.
Ça ne fonctionne pas.
Voici un extrait d'un ouvrage que j'utilise pour découvrir ADO.NET:
"Comment appliquer les nouvelles valeurs de compteur aux lignes de [relation] en attente ? En fait vous n'en avez pas besoin. Laissez ADO.NET faire le travail au travers de l'objet DataRow. Par défaut, cet objet transmet les modifications en cascade. Si vous avez défini une DataRow entre les objets DataTable [relation] et [enfants] dans votre DataSet, dès que vous avez soumis les données des nouveaux enfants, la DataRow transmets en cascade les nouvelles valeurs à la DataTable [relation]"
Quelqu'un connait il cette mécanique ?
Dans mon dataset j'ai défini des relations entre les datatables mais je ne vois pas comment définir une datarow entre les datatables.....