avril
2006
Après de longues recherches sur le net qui ne m’ont pas donné beaucoup de satisfaction et vu que j’ai compris le pourquoi et comment éviter cela, je vous en fais part. Bon c’est peut être idiot mais je suis sûr que ca servira un jour à quelqu’un…
(cet exemple se base sur 2 DataSets qui contient une table identique mais il est adaptable à une base de données avec plusieurs mises à jour de suite…)
Après avoir créé deux DataSets et les avoir rempli de cette manière:
this.NomTableTableAdapter1.Fill(this.dataSet1.NomTable);
et en supposant que DataRowModifiee est la dernière ligne qui a été … modifiée (on s’en serait douté), si l’on souhaite utiliser cette même ligne pour mettre à jour les deux bases de la sorte:
DataRowModifiee.SetModified();
NomTableTableAdapter1.Update(DataRowModifiee);
nous obtenons une DBConcurrencyException avec le message « the UpdateCommand affected 0 of the expected 1 records ».
Pour résoudre le problème, rien de plus simple… Dans le menu: Data > Show Data Sources puis clic droit sur le DataSet et « Edit DataSet with Designer »…
Vous devriez trouver notre NomTableTableAdapter. Clic droit puis « Configure » puis « Advanced Options » sur cet Adapter. Décochez la case « Use optimistic concurrency ».
Quel est son effet? Simplement de signaler qu’il ne faut pas tester tous les champs pour voir si quelqu’un d’autre n’a pas déjà mis à jour cette donnée mais uniquement de se baser sur la clé primaire. Dans notre cas, c’est nécessaire puisque, après être passé dans le .Update, la DataRow ne contient plus ses anciennes valeurs… Dur dur lors de la comparaison du coup!
Il est évident que vous ne modifiez cela que si vous êtes sûr de ce que vous faites
2 Commentaires + Ajouter un commentaire
Articles récents
- DotNet User Group : Découvrez gratuitement et avant tout le monde ce que sera le futur de .NET le 14 décembre 2007 à Paris
- Technet Session le 10 octobre à Luxembourg
- Web Development with Visual Studio 2008 – 16.10.07 – Luxembourg
- Microsoft Office: offre spéciale pour les étudiants
- SP1 pour Vista, SP3 pour XP et Windows Server 2008: disponibilité durant le premier trimestre 2008
Commentaires récents
- Comment éviter la DBConcurrencyException lors de mises à jour en ADO.NET? dans
- Comment éviter la DBConcurrencyException lors de mises à jour en ADO.NET? dans
- DotNet User Group : Découvrez gratuitement et avant tout le monde ce que sera le futur de .NET le 14 décembre 2007 à Paris dans
- DotNet User Group : Découvrez gratuitement et avant tout le monde ce que sera le futur de .NET le 14 décembre 2007 à Paris dans
- Microsoft Office: offre spéciale pour les étudiants dans
Archives
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
- décembre 2006
- novembre 2006
- septembre 2006
- juillet 2006
- juin 2006
- mai 2006
- avril 2006
- mars 2006
- janvier 2006
- décembre 2005
- novembre 2005
- octobre 2005
- août 2005
- juillet 2005
- juin 2005
- mai 2005
- avril 2005
Ah bin j’ai trouvé finalement : au lieu de déclarer des variables d’instance pour mon DataTable et TableAdapter, j’ai utilisé les composants que .Net m’a gentillement créé en faisant un glisser-déposé sur ma Form. Maintenant ca ne plante plus même en réactive le lock optimistic.
En plus ca fait moins de code à écrire car je n’ai plus à gérer l’instanciation de mes classes !
Merci bcp pour ce post, ca a effectivement réglé mon pb, mais je ne comprend toujours pas pourquoi il se produisait. Dans mon cas de figure j’utilise une seule table dans un seul DataSet, je procède comme suit :
– Chargement des données dans un DataGridView via un DataTable rempli par un TableAdapter
– Modification du libellé d’une ligne par l’utilisateur
– Appel de Update sur le TableAdapter
=> Erreur DBConcurrencyException