Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何避免gridview上针对特定记录的并发更新?_Asp.net - Fatal编程技术网

Asp.net 如何避免gridview上针对特定记录的并发更新?

Asp.net 如何避免gridview上针对特定记录的并发更新?,asp.net,Asp.net,在Gridview中,当用户正在更新一条记录时,如何限制其他用户不在同一条记录上更新?如果您指的是如何避免数据库级别的并发错误,您可以通过用于更新该记录的代码来做到这一点 关于这个主题的好链接。还有很多其他的 如果您的意思是,“我如何阻止用户甚至开始编辑其他人正在另一个GridView中更新的记录”,那将要复杂得多。有很多不同的方法可以做到这一点,但我想我会考虑保留正在更新的记录ID的缓存,并使用一些方法使条目过期(在用户开始编辑但漫游、系统故障或从未完成的情况下) 有很多方法可以一次“锁定”一

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

如果您指的是如何避免数据库级别的并发错误,您可以通过用于更新该记录的代码来做到这一点

关于这个主题的好链接。还有很多其他的

如果您的意思是,“我如何阻止用户甚至开始编辑其他人正在另一个GridView中更新的记录”,那将要复杂得多。有很多不同的方法可以做到这一点,但我想我会考虑保留正在更新的记录ID的缓存,并使用一些方法使条目过期(在用户开始编辑但漫游、系统故障或从未完成的情况下)

有很多方法可以一次“锁定”一个用户的记录,但这会导致数据库运行速度非常慢,更不用说在现实世界中它并不实用。避免并发问题的更好方法是在加载gridview时捕获原始值,并且在运行update语句或delete语句后,如果原始值不匹配,数据库将拒绝该命令。看看下面我几周前做的这个项目的代码。请特别注意原始参考值

<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语句之后,您只需要一些代码来使用事件处理程序(如“item inserted”)处理任何数据库异常。请参阅下面的代码

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();

    }
protectedvoid DetailsView1\u itemsupdated(对象发送方,DetailsViewUpdatedEventArgs e)
{
如果(例如异常!=null)
{
lblError.Text=“发生数据库错误。

“+”消息:“+e.Exception.Message; e、 ExceptionHandled=true; e、 KeepInEditMode=true; } else if(e.AffectedRows==0) lblError.Text=“其他用户可能已更新该产品。”+“
请重试。”; 其他的 DetailsView1.DataBind(); } 受保护的void DetailsView1_itemsdeleted(对象发送方,DetailsViewDeletedEventArgs e) { 如果(例如异常!=null) { lblError.Text=“发生数据库错误。

“+”消息:“+e.Exception.Message; e、 ExceptionHandled=true; } else if(e.AffectedRows==0) lblError.Text=“其他用户可能已更新该产品。”+“
请重试。”; 其他的 DetailsView1.DataBind(); DropDownList1.DataBind(); } 受保护的void DetailsView1_itemserted(对象发送方,DetailsViewInsertedEventArgs e) { 如果(例如异常!=null) { lblError.Text=“发生数据库错误。

“+”消息:“+e.Exception.Message; e、 ExceptionHandled=true; e、 KeepInInsertMode=true; } 其他的 DetailsView1.DataBind(); DropDownList1.DataBind(); }
希望有帮助