Dans Gridview, lorsque l'utilisateur met à jour un enregistrement et comment empêcher un autre utilisateur de mettre à jour le même enregistrement?Comment éviter les mises à jour simultanées sur gridview pour un enregistrement particulier?
Répondre
Il existe des moyens de "verrouiller" les enregistrements à un utilisateur à la fois, mais cela aboutit à une base de données très lente, sans compter que ce n'est tout simplement pas si pratique dans des situations réelles. La meilleure méthode pour éviter les problèmes de simultanéité consiste à capturer les valeurs d'origine lorsque la grille est chargée et une fois qu'une instruction de mise à jour ou une instruction de suppression est exécutée, la base de données rejette la commande si les valeurs d'origine ne correspondent pas. Jetez un oeil sur le code ci-dessous pour ce projet que j'ai fait il y a quelques semaines. Portez une attention particulière aux références des valeurs d'origine.
<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:TechSupport_DataConnectionString %>"
DeleteCommand="DELETE FROM [Technicians] WHERE [TechID] = @original_TechID AND [Name] = @original_Name AND [Email] = @original_Email AND [Phone] = @original_Phone"
InsertCommand="INSERT INTO [Technicians] ([Name], [Email], [Phone]) VALUES (@Name, @Email, @Phone)"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT * FROM [Technicians] WHERE ([TechID] = @TechID)"
UpdateCommand="UPDATE [Technicians] SET [Name] = @Name, [Email] = @Email, [Phone] = @Phone WHERE [TechID] = @original_TechID AND [Name] = @original_Name AND [Email] = @original_Email AND [Phone] = @original_Phone">
<SelectParameters>
<asp:ControlParameter ControlID="DropDownList1" Name="TechID"
PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
<DeleteParameters>
<asp:Parameter Name="original_TechID" Type="Int32" />
<asp:Parameter Name="original_Name" Type="String" />
<asp:Parameter Name="original_Email" Type="String" />
<asp:Parameter Name="original_Phone" Type="String" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="Name" Type="String" />
<asp:Parameter Name="Email" Type="String" />
<asp:Parameter Name="Phone" Type="String" />
<asp:Parameter Name="original_TechID" Type="Int32" />
<asp:Parameter Name="original_Name" Type="String" />
<asp:Parameter Name="original_Email" Type="String" />
<asp:Parameter Name="original_Phone" Type="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="Name" Type="String" />
<asp:Parameter Name="Email" Type="String" />
<asp:Parameter Name="Phone" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
Après avoir réglé les instructions SQL, alors vous avez juste besoin de code pour gérer les exceptions de base de données à l'aide de gestionnaires d'événements tels que « élément inséré », etc. Voir le code ci-dessous.
protected void DetailsView1_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
{
if (e.Exception != null)
{
lblError.Text = "A database error has occurred.<br /><br />" + "Message: " + e.Exception.Message;
e.ExceptionHandled = true;
e.KeepInEditMode = true;
}
else if (e.AffectedRows == 0)
lblError.Text = "Another user may have updated that product." + "<br />Please try again.";
else
DetailsView1.DataBind();
}
protected void DetailsView1_ItemDeleted(object sender, DetailsViewDeletedEventArgs e)
{
if (e.Exception != null)
{
lblError.Text = "A database error has occurred.<br /><br />" + "Message: " + e.Exception.Message;
e.ExceptionHandled = true;
}
else if (e.AffectedRows == 0)
lblError.Text = "Another user may have updated that product." + "<br />Please try again.";
else
DetailsView1.DataBind();
DropDownList1.DataBind();
}
protected void DetailsView1_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
{
if (e.Exception != null)
{
lblError.Text = "A database error has occurred.<br /><br />" + "Message: " + e.Exception.Message;
e.ExceptionHandled = true;
e.KeepInInsertMode = true;
}
else
DetailsView1.DataBind();
DropDownList1.DataBind();
}
Espérons que ça aide.
Si vous voulez éviter les erreurs de concurrence au niveau de la base de données, vous le feriez avec le code que vous avez utilisé pour mettre à jour l'enregistrement.
Here's un bon lien sur le sujet. Il y en a beaucoup d'autres aussi. Si vous voulez dire "Comment empêcher un utilisateur de commencer à modifier un enregistrement que quelqu'un d'autre est en train de mettre à jour dans un autre GridView", ce serait beaucoup plus compliqué. Il y aurait plusieurs façons de le faire, mais je pense que je chercherais à garder un cache des identifiants des enregistrements qui sont mis à jour, avec des moyens pour expirer les entrées (dans le cas où l'utilisateur a commencé à éditer mais a erré off, a subi une défaillance du système, ou n'a jamais été terminée).
- 1. Comment éviter les mises à jour fréquentes?
- 2. mysql mises à jour séquentielles ou mises à jour simultanées
- 3. mises à jour simultanées sur un tableau en Java
- 4. Comment MongoDB gère-t-il les mises à jour simultanées?
- 5. Éviter les modifications simultanées
- 6. Mises à jour simultanées sur deux contextes d'affichage dans openGL
- 7. Mises à jour GridView multithread
- 8. Gridview mises à jour dans un Updatepanel
- 9. Mises à jour simultanées dans Oracle: Verrouillage ou non?
- 10. Utiliser applyFilter pour les mises à jour
- 11. GridView pour se rafraîchir lorsque CLICK données mises à jour
- 12. Multiples mises à jour simultanées avec MongoDB/PyMongo?
- 13. attr_protected uniquement pour les mises à jour?
- 14. Mettre à jour un enregistrement particulier sur un clic sur un bouton d'envoi spécifique
- 15. Grande table MyISAM lent, même pour les insertions non simultanées/mises à jour
- 16. Enregistrement des mises à jour d'objets dans les rails
- 17. Commentaires et mises à jour sur facebook mises à jour
- 18. Comment faire pour conserver la valeur SelectedValue dans un GridView lorsque les lignes sont mises à jour
- 19. ChangeConflictException dans les mises à jour non simultanées de Linq à Sql
- 20. Notification pour les mises à jour utilisateur
- 21. Cocoa Check pour les mises à jour
- 22. pour aller chercher un enregistrement particulier
- 23. Les mises à jour simultanées de JPA sur les noeuds d'arbre mènent à des blocages de transaction
- 24. Comment empêcher plusieurs mises à jour dans un enregistrement dans php/mysql
- 25. Comment synchroniser les mises à jour sur différents sites? .Net
- 26. Augmenter les performances des sélections simultanées et des mises à jour
- 27. postgres: Comment éviter INSERT dans un cas particulier
- 28. Comment vérifier une entité pour les mises à jour
- 29. Comment gérer les mises à jour d'ubuntu?
- 30. comment conserver mes données filtrées jusqu'à ce que je mette à jour cet enregistrement particulier