2013-02-18 81 views

回答

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

    } 

希望有所帮助。

0

如果您的意思是如何避免数据库级别的并发错误,您可以通过您用来更新记录的代码来实现。

Here's关于这个问题的一个很好的链接。还有很多其他的。

如果你的意思是“如何防止用户开始编辑其他人正在更新另一个GridView过程中的记录”,那将会更加复杂。有很多不同的方法可以做到这一点,但我想我会考虑保留正在更新的记录的ID的缓存,并提供一些用于过期条目的方法(在用户开始编辑但漫游的情况下关机,系统故障,否则永远不会完成)。

相关问题