在 Gridview 中,当用户更新记录时,如何限制其他用户不更新同一记录?
问问题
506 次
2 回答
0
如果您的意思是如何避免数据库级别的并发错误,您可以通过用于更新记录的代码来实现。
这是关于这个主题的一个很好的链接。还有很多其他的。
如果您的意思是“我怎样才能阻止用户甚至开始编辑其他人正在另一个 GridView 中更新的记录”,那将更加复杂。有很多不同的方法可以做到这一点,但我想我会考虑保留正在更新的记录的 ID 的缓存,并通过一些方法使条目过期(在用户开始编辑但徘徊的情况下)关闭、遭受系统故障或以其他方式从未完成)。
于 2013-02-18T16:09:09.730 回答
0
有一些方法可以一次将记录“锁定”给一个用户,但是这会导致数据库非常慢,更不用说在现实世界的情况下它根本不那么实用。避免并发问题的更好方法是在加载 gridview 时捕获原始值,并且一旦运行更新语句或删除语句,如果原始值不匹配,数据库将拒绝该命令。看看我几周前做的这个项目的下面的代码。特别注意原始值引用。
<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>
调整 sql 语句后,您只需要一些代码来使用事件处理程序(例如“插入项目”等)处理任何数据库异常。请参见下面的代码。
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();
}
希望有帮助。
于 2013-02-18T17:33:05.360 回答