我有一个用 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();
}
我希望这有帮助...