C#.NET で作成されたアプリケーションを使用しています。このアプリケーションでは、ユーザーは SQL Server で作成されたデータベースにアクセスしてインシデントを入力、編集、および削除します。アプリケーションは検索ページを使用して、検索クエリからのさまざまな行をデータグリッドに入力します。次に、選択すると、ユーザーは更新ボタンを押すことができます。更新ボタンを押すと、データが編集用のフォームに入力される別のページに進みます。私の問題はどこですか。ユーザーがデータベースから行にアクセスしたときに、別のユーザーが同じページをプルアップできないように、ロック メカニズムを実装しようとしています。現在、ページが呼び出している各ストアド プロシージャにいくつかのトランザクションを実装しましたが、それはトリックを行うと考えていますが、残念ながら、各ストアド プロシージャは、ページが読み込まれるときに個別に呼び出され、データが入力された後に閉じられます。したがって、そこからロックアウトする方法はありません。この特定のページがロードされたときに、これを同時ユーザーにロックアウトしようとする私の次の考えに至ります。ページにデータを入力するメインのストアド プロシージャは、データを取得するために IncidentID を呼び出します。この ID が Page_Load で使用されているかどうかを確認する方法はありますか? 私はまだ初心者レベルで、肩に巨大な頭を抱えているので、この実装の多くはここや他の Web ページから学んでいますが、まだ役立つものは何も見つかりません... コードはかなり長いです参照するものが必要な場合はお知らせください。ティア この ID が Page_Load で使用されているかどうかを確認する方法はありますか? 私はまだ初心者レベルで、肩に巨大な頭を抱えているので、この実装の多くはここや他の Web ページから学んでいますが、まだ役立つものは何も見つかりません... コードはかなり長いです参照するものが必要な場合はお知らせください。ティア この ID が Page_Load で使用されているかどうかを確認する方法はありますか? 私はまだ初心者レベルで、肩に巨大な頭を抱えているので、この実装の多くはここや他の Web ページから学んでいますが、まだ役立つものは何も見つかりません... コードはかなり長いです参照するものが必要な場合はお知らせください。ティア
編集:ここにいくつかのコードがあります。私は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();
}
これが役立つことを願っています...