0

在 Gridview 中,当用户更新记录时,如何限制其他用户不更新同一记录?

4

2 回答 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 回答