Comment mettre à jour Dataset tables parent et enfant avec AutoGénéré Identité clé?

StackOverflow https://stackoverflow.com/questions/931630

  •  06-09-2019
  •  | 
  •  

Question

Je suis à l'aide de ADO.NET dans datasets mes applications VB. J'ai un DataSet typé avec une table de parent et de nombreuses tables d'enfant. Je veux générer l'identité clé lors de l'insertion des données dans le tableau des parents et mettre à jour les données dans toutes les tables de l'enfant avec la même clé (comme la clé Foregin).

Enfin, je veux mettre à jour l'ensemble des données dans la base de données (SQL Server08).

Eh bien, la chose ci-dessus peut être possible en insérant d'abord le tableau des parents dans la base de données directement, obtenir la colonne d'identité et que l'utilisation à des tables d'enfants.

Mais je veux cela comme une opération automatique (comme LINQ to SQL qui prend en charge primaire et clé étrangère dans datacontext.)

I telle chose possible Dataset qui se charge de la colonne AutoGénéré pour les tables des parents et des enfants?

Merci,

ABB

Pas de solution correcte

Autres conseils

Je pense que cela devrait être plus évident et devrait fonctionner sans aucune modification. Mais encore, il est assez facile.

La solution comporte deux parties:

  1. Créer DataRelation entre les tables enfant et parent et le mettre en cascade sur les mises à jour. De cette façon, chaque fois qu'un changement d'identification des parents, tous les enfants seront mis à jour.

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId"))
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade
    
  2. commandes d'insertion et de mise à jour du jeu de données sont à deux voies: S'il y a des paramètres de sortie liés ou toutes les lignes de données renvoyées, ils seront utilisés pour mettre à jour la ligne de jeu de données qui a provoqué la mise à jour.

    Ceci est très utile pour ce problème particulier: obtenir des colonnes générées automatiquement revenir à l'application. En dehors de l'identité cela pourrait être par exemple une colonne d'horodatage. Mais l'identité est le plus utile.

    Tout ce que nous devons faire est de définir la commande d'insertion pour retourner l'identité. Il y a plusieurs façons de le faire, par exemple:

    a) En utilisant la procédure stockée avec le paramètre de sortie. Ceci est le moyen le plus portable entre les bases de données « réelles ».

    b) L'utilisation de plusieurs instructions SQL, avec un dernier retour ligne insérée. Ceci est spécifique à SQL AFAIK Server, mais le plus simple:

    insert into Parent (Col1, Col2, ...) values (@Col1, @Col2, ...);
    select * from Parent where Id = SCOPE_IDENTITY();
    

Après cette mise en place, tout ce que vous devez faire est de créer des lignes de parents avec Ids qui sont uniques (dans) ensemble unique de données, mais impossible dans la base de données. Les nombres négatifs sont généralement un bon choix. Ensuite, lorsque vous enregistrez les modifications dataset à la base de données, toutes les nouvelles lignes de parents obtiendront une réelle Ids la base de données.


Remarque: Si vous arrive de travailler avec la base de données sans supports multiples déclarations et sans procédures stockées (par exemple accès), vous devez gestionnaire d'événements d'installation sur événement RowUpdated adaptateur de table parent. Dans le hanler vous devez obtenir l'identité avec la commande select @@IDENTITY.


Quelques liens:

Couple de choses à souligner.

  1. Oui, vous avez certainement des relations affectées pour les deux tables. Vous pouvez vérifier à partir de l'éditeur de xsd (double-cliquez sur votre fichier XSD). Par défaut, la relation est définie comme « relation seulement » qui ne dispose d'aucune « règle de mise à jour ». Modifier cette relation en allant dans « modifier relation » et sélectionnez « Constraint clé étrangère uniquement » ou « Les deux ~~~ » un. Et besoin de définir « Mise à jour de la règle », comme Cascade! 'Supprimer la règle' est à vous.

  2. Maintenant, lorsque vous utilisez un nouveau ID de ligne de la table parent (AutoIncrement) pour de nouvelles lignes de la table des enfants comme une clé étrangère, vous devez ajouter la ligne mère dans la première table avant d'utiliser l'ID de la nouvelle ligne de parent autour.

  3. Dès que vous appelez mise à jour pour la table parent à l'aide TableAdapter, les nouvelles lignes de la table des enfants associés auront correcte parentID AUTOMATIQUEMENT.

Mes simples extraits de code:

'--- Make Parent Row
Dim drOrder as TOrderRow = myDS.TOder.NewTOrderRow
drOrder.SomeValue = "SomeValue"
myDS.TOrder.AddTOrderRow(drOrder) '===> THIS SHOULD BE DONE BEFORE CHILD ROWS

'--- Now Add Child Rows!!! there are multiple ways to add a row into tables....
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailValue1")
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailvalue2")
'....
'....

'--- Update Parent table first
myTableAdapterTOrder.Update(myDS.TOrder)
'--- As soon as you run this Update above for parent, the new parent row's AutoID(-1)
'--- will become real number given by SQL server. And also new rows in child table will
'--- have the updated parentID

'--- Now update child table
myTableAdapterTOrderDetail.Update(myDS.TOrderDetail)

J'espère que ça aide!

Et si vous ne voulez pas utiliser des jeux de données et encore obtenir les identifiants assignés à Childs et obtenir les ids de sorte que vous pouvez mettre à jour votre modèle: https://danielwertheim.wordpress.com/2010/10/ 24 / C-identité-batch inserts /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top