[C#] [ADO] Dataset et autoincrement

Bonjour tous,

Ma question va peut-être sembler extrêmement basique à certains d’entre vous…

Un cas concret: j’ai une base de donnée (disons sous Access) qui comprends 2 tables avec les champs suivants:
Table 1
-id (autoincrement)
-trucchose

Table 2
-id (autoincrement)
-bidule
-id_table1

Sachant que je crée une relation avec table1 parent et table2 enfant. Comme clef de contrainte, j’ai Table2.id_table1 = Table1.id

Sous VS2005, je créé un dataset basé sur cette DB… (et un formulaire qui va bien)

Si j’ajoute une entrée dans ma DB avec mon Form, le dataset me génère bien le Table2.id_table1 qui va bien… (pas de problème donc)…
Imaginons, je j’éfface le dernier enregistrement de ma Table1 (mettons, celui qui porte l’id 3) avec access… Si je recrée une entrée sous access, mon prochian enregistrement sera le 4… Tandis, que si je le fais avec mon formulaire, mon nouvel ID sous mon form sera de 3, mais lorsque je ferait un update sur mon table adapter, l’ID réel dans ma base sera de 4… (donc, je vais avoir un problème de relation entre ma table1 et ma table 2)…
Question: comment pouvoir synchroniser les 2 ID (celui de mon dataset, et celui de ma BD), c-a-d comment être sûr que l’ID généré avec mon dataset soit bien synchronisé avec celui de ma base de donnée ?

Dans un premier temps, j’ai tenté de mettre les valeurs AutoincrementSeed et AutoIncremntStep à -1 de mes deux valeurs autoincrémentées… Malheureusement, je suis “obligé” de “refiller” mon dataset avant de remplir ma table 2 sans quoi, mon Table2.id_table1 sera égal à -1…

J’espère que je suis à peu près clair dans mes explications…

La solution conseillée dans un tel cas est bien de mettre -1 en seed & en step dans ton dataset, à condition que tu aies défini les relations (DataRelation) entre tes DataTable.

Sachant que les DataRelation répercutent automatiquement les changements de valeur de tes clé primaire dans les colonnes des tables référencées, après avoir inséré ta ligne, tu vas obtenir la véritable valeur insérée par ton SGBD.

Donc dès que tu vas mettre à jour ta valeur de clé primaire de -1 vers la valeur otenue, la modification sera aumatiquement répercutée sur toutes les tables référencées à l’aide de DataRelation.

(désolé, je suis un débutant…)
Alors, j’avais mis une datarelation à “relation only”…
Mes mises à jour fonctionnent excepté qu’elle ne sont pas synchro avec ma DB…
J’ai donc mis une relation “Relation and foreign key” avec Table1.id (parent) et Table2.id_table1(child)…
En ce cas, lorsque je crée un nouvel enregistrement et que je rempli les champs de ma table2, j’ai une message me disant qu’il ne peux pas créer l’enregistrement car ma relation requière que l’entrée -1 doit exister dans ma table parent (ce qui somme toute est assez logique…)
(pour info, updaterule, accepetrule et deleterule sont sur cascade)

Synchro avec ta DB elles ne le seront jamais…

C’est à toi de gérer les insertions et de récupérer la clé générée (en access je pense que tu es obligé de refaire un select derrière, à moins qu’il existe une commande à la @@IDENTITY ou SELECT_IDENTITY() pour récupérer la dernière autoincrement générée).

Une fois cette nouvelle clé générée, tu mets à jour la colonne de ta table. Grâce à ton updaterule en cascade, la mise à jour va se répercuter sur les tables “filles”.

En fait, j’avais essayé select @@indentity
Le problème, c’est que j’ai utilisé le designer pour ma bd, lors d’un update, il me close la connection à cette dernière… Du coup, mon selct @@identity est toujours = 0…
Ce que j’ai fait: j’ai fait un update avec un fill derrière… Ce n’est peu être pas très propre, mais ça fonctionne plutôt bien…

Normalement, si tu peux modifier la commande créé par le designer (regarde le paramètre InsertCommand si c’est un DataAdapter), et dans ce cas, modifie la clause pour qu’elle inclue le SELECT en mettant les deux opérations dans la même clause :

“INSERT INTO …; SELECT @@IDENTITY;”

Ca devrait te permettre de récupérer l’identity, vu qu’il utilise 1 seul objet Command pour exécuter les 2 requetes.