2011-06-24 1 views
2

J'utilise DataTables dans VB.NET 2.0, et j'écris du code pour gérer les violations de concurrence que je prévois de se produire dans un environnement multi-utilisateur. Je comprends comment intercepter les violations de concurrence, mais je ne comprends pas comment les résoudre en utilisant les commandes INSERT, UPDATE et DELETE générées par DbCommandBuilder.Comment résoudre les violations de simultanéité avec des DataTables dans .NET?

Il me semble que les violations se produisent dans de concurrence cinq situations différentes:

... Quand

  1. Mise à jour une ligne qui a été mis à jour simultanément dans la base de données
  2. Mise à jour d'une ligne qui a été supprimé simultanément de la base de données
  3. Suppression d'une ligne qui a été mise à jour simultanément dans la base de données
  4. Suppression d'une ligne con actuellement supprimé de la base de données
  5. Insertion d'une ligne dont la clé primaire a été insérée dans la base de données en même temps

Je sais comment résoudre la situation 1; J'ai trouvé plusieurs exemples d'utilisation de la méthode DataTable.Merge pour synchroniser les lignes mises à jour. Cependant, Fusionner ne semble pas fonctionner pour les 4 autres situations. Par exemple, supposons que j'essaie de mettre à jour une ligne qui a été supprimée simultanément de la base de données (situation 2), et mes règles métier me disent de restaurer la ligne dans la base de données avec les valeurs de colonne mises à jour. Je ne peux pas comprendre comment modifier les propriétés DataRow de sorte que la méthode Adapter.Update insérera la ligne dans la base de données comme requis; Fusionner ne le fait pas. Compte tenu de la facilité avec laquelle Merge gère la situation 1, je suis certain qu'il doit y avoir aussi des résolutions simples aux autres violations de concurrence, et je les ai simplement oubliées. Quelqu'un peut-il me donner un coup de pouce dans la bonne direction?

-TC

Répondre

0

Si la ligne que vous essayez de mettre à jour a été supprimé par un autre processus, et vous avez besoin de restaurer, alors vous devez attraper l'exception de la concurrence qui se produit lorsque vous essayez de mettre à jour et répondre en insérant la ligne de retour dans la base de données:

  1. Enregistrez les valeurs mises à jour.
  2. Fusionnez les violations de concurrence dans votre table, ce qui supprimera la ligne qui a été supprimée dans la base de données.
  3. Insérez une nouvelle ligne dans votre tableau avec les valeurs enregistrées.
  4. Enregistrez la table.
+0

David, Merci pour la réponse. Malheureusement, je trouve que l'étape 2 ne fonctionne pas comme vous le décrivez. Lorsque je fusionne les violations de concurrence dans ma table, les lignes qui ont été supprimées de la base de données ne sont pas supprimées du DataTable. –

+0

En outre, vous mentionnez que cela devrait être fait en réponse à une exception de concurrence. Cependant, je trouve que les exceptions de simultanéité sont levées pour une violation à la fois, alors que la fusion doit être faite pour toute la table à la fois. Par conséquent, la gestion des violations au moment où les exceptions sont levées permet la possibilité qu'une deuxième ou troisième violation ne soit pas gérée correctement. À cause de cela, j'ai conclu que les exceptions de concurrence ne peuvent pas être invoquées pour initier la réponse, et je dois traquer préventivement les violations. Est-ce que je me trompe? –

Questions connexes