0

我有一个用 C#.NET 编写的应用程序,用户可以在其中输入、编辑和删除访问使用 SQL Server 创建的数据库的事件。该应用程序使用搜索页面将搜索查询中的各种行填充到数据网格中,然后一旦选择,用户就可以按下更新按钮,然后进入另一个页面,将数据填充到表单中进行编辑,即我的问题在哪里。我正在尝试实现一种锁定机制,以便当用户访问数据库中的一行时,另一个用户将无法拉出同一页面。目前我已经为页面调用的每个存储过程实现了几个事务,认为这可以解决问题,但是,每个存储过程在页面加载时被单独调用,然后在填充数据后关闭,所以没有办法通过那里锁定。我的下一个想法是,尝试在此特定页面加载时将其锁定给并发用户。填充页面的主存储过程调用 IncidentID 来检索数据,那么有没有办法检查该 ID 是否在 Page_Load 中使用?我仍然是入门级,我的肩膀很大,所以我通过这里和其他网页学习了很多这种实现,但我还没有找到任何帮助......代码很长但如果您需要任何参考,请告诉我。TIA 那么有没有办法检查Page_Load中是否使用了这个ID?我仍然是入门级,我的肩膀很大,所以我通过这里和其他网页学习了很多这种实现,但我还没有找到任何帮助......代码很长但如果您需要任何参考,请告诉我。TIA 那么有没有办法检查Page_Load中是否使用了这个ID?我仍然是入门级,我的肩膀很大,所以我通过这里和其他网页学习了很多这种实现,但我还没有找到任何帮助......代码很长但如果您需要任何参考,请告诉我。TIA

编辑:这是一些代码。我正在使用 SSMS,因此为我添加了分号。这些是测试,但具有确切的语法...查询以使用数据填充表单

USE [Test_Live]
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_SelectIncident_ByCaseNumberUpdate]
(
    @IncidentID int
)
AS
BEGIN TRANSACTION
SELECT i.IncidentID,
i.PersonID,
i.BusInfoID,
i.TypeOfIncident,
i.DateOfIncident,
/* etc. etc. */
FROM tblTestIncident i WITH(ROWLOCK)
left JOIN tblTestPerson p on i.PersonID = p.PersonID
/* some other joins are here */
WHERE i.IncidentID = @IncidentID
COMMIT

用数据填充表单的 C# 代码。GetConnection() 方法位于页面正在使用的另一个 .dll 文件中。它通过 ConfigurationSettings.AppSettings 返回连接字符串。

protected void Page_Load(object sender, EventArgs e)
{
    this.gIncidentID = Convert.ToInt32(Utils.decryptQueryString(this.Request.QueryString["iid"]));
    try
    {
        this.lblCurrentUser.Text = this.Page.User.Identity.Name.ToUpper();
    }
    catch (Exception ex)
    {
       this.lblErrors.Text = this.lblErrors.Text + "Unexpected exception in Load: " + ex.Message + ". ";
    }
    this.populateFormWithData(this.gIncidentID);
}

private void populateFormWithData(int incidentID)
{
   SqlConnection connection = this.GetConnection();
   SqlParameter sqlParameter = new SqlParameter("@IncidentID", SqlDbType.Int);
   sqlParameter.Direction = ParameterDirection.Input;
   sqlParameter.Value = (object)incidentID;
   SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
   sqlDataAdapter.SelectCommand = new SqlCommand();
   DataSet dataSet = new DataSet();
   sqlDataAdapter.SelectCommand.Connection = connection;
   sqlDataAdapter.SelectCommand.CommandText = "sp_SelectIncident_ByCaseNumberUpdate";
   sqlDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
   sqlDataAdapter.SelectCommand.Parameters.Add(sqlParameter);
   sqlDataAdapter.Fill(dataSet, "Incident");
   if (dataSet.Tables["Incident"].Rows.Count > 0)
   {
      //code that fills in all fields within the page
   }
   else
   {
      this.lblCaseNumberData.ForeColor.Equals((object)"Red");
      this.lblCaseNumberData.Text = "No Case data found!";
   }
   //this is where I think the problem is as to why the transactions aren't working
   connection.Close();
}

我希望这有帮助...

4

1 回答 1

1

像这样锁定数据可能会出现问题。用户可以保持页面打开并离开一天。数据将被锁定,直到它们返回。您最好在表中添加一个 TimeStamp 列,并在更新之前检查它是否已更改。如果时间戳已更改,请通知用户并重新加载数据。

请参阅此处的示例:

SQL Server 乐观锁定 - 返回更改的时间戳值

时间戳/行版本信息:

http://msdn.microsoft.com/en-us/library/ms182776%28v=sql.105%29.aspx

于 2013-10-29T00:17:47.230 回答