Question

Quelle est la meilleure approche pour synchroniser un DataSet avec les données d’une base de données? Voici les paramètres:

  • Nous ne pouvons pas simplement recharger les données, car elles sont liées à un contrôle d'interface utilisateur qu'un utilisateur peut avoir configuré (il s'agit d'une grille qu'ils peuvent développer / réduire)
  • Nous ne pouvons pas utiliser de flag de changement (comme un UpdatedTimeStamp) dans la base de données, car les modifications ne se répercutent pas toujours dans l'application (par exemple, un administrateur de base de données peut mettre à jour un champ avec une instruction SQL)
  • Nous ne pouvons pas utiliser de déclencheur de mise à jour dans la base de données car il s'agit d'un système multi-utilisateur
  • Nous utilisons des ensembles de données ADO.NET
  • Plusieurs champs peuvent changer d'une ligne donnée

J'ai examiné la fonctionnalité de fusion du DataSet, mais cela ne semble pas garder la notion d'un "ID". colonne. J'ai examiné la fonctionnalité DiffGram, mais le problème ici est que celles-ci semblent être générées à partir de modifications apportées au même ensemble de données plutôt que de modifications apportées à une source de données externe.

Cela fait quelque temps que je cours depuis cette solution, mais l’approche que je saurais travailler (avec beaucoup d’inefficacité) consiste à créer un DataSet séparé, puis à itérer toutes les lignes qui appliquent des modifications, champ par champ, au DataSet sur. auquel il est lié.

Quelqu'un at-il eu un scénario similaire? Qu'avez-vous fait pour résoudre le problème? Même si vous n'avez pas rencontré de problème similaire, toute recommandation de solution est la bienvenue.

Merci

Était-ce utile?

La solution

DataSet.Merge fonctionne bien pour cette si vous avez une clé primaire définie pour chaque DataTable; le DataSet générera des événements modifiés sur tous les contrôles de l'interface graphique en fonction des données

si votre table est petite, vous pouvez simplement relire toutes les lignes et les fusionner périodiquement. Autrement, limiter le jeu à lire avec un horodatage est une bonne idée - il suffit d'indiquer aux administrateurs de base de données de suivre les règles et de mettre à jour l'horodatage; -)

une autre option - qui demande un peu de travail - consiste à conserver une file d'attente de lignes modifiées (horodatage, ID de ligne) à l'aide d'un déclencheur ou d'une procédure stockée, et à baser les requêtes d'actualisation à partir de l'horodatage de la file d'attente; cela sera plus efficace si la table de base contient beaucoup de lignes, ce qui vous permettra (via une jointure interne sur l'enregistrement de la file d'attente) d'extraire uniquement les lignes modifiées depuis la dernière heure d'interrogation.

Autres conseils

Je pense qu'il serait plus facile de stocker une liste des nœuds développés par l'utilisateur (en supposant que vous puissiez identifier chacun d'eux individuellement), puis de recharger les données et de les lier de nouveau à la vue arborescente, puis de les développer. tous les nœuds précédemment développés.

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