SQL Server 2008 R2 と PetaPoco ORM で ASP.NET 4.0 を使用しています。
Web フォームは、次のようなタブ パネルで構成されます。
-- 従業員の一般情報
- 予定
- 教育
タブ パネルの各エントリは、SQL Server の特定のテーブルに移動します。主キーempIDを持つメインテーブルemployeeがあります。その他のテーブル、つまり、任命、教育などは empID に関連付けられています。
それぞれのテーブルにレコードを保存する方法は複数あります。
AddGeneralInformationは、一般情報タブ パネル レコードを保存します。
AddAppointmentは、予定の詳細などを保存します。
アプリケーションは、複数のユーザーがレコードを挿入または更新している同時環境で使用されています。
2 番目と 3 番目のメソッドで新しいレコードを挿入するには、メソッドに正しい empID が必要です。最初のメソッド (一般情報) がレコードを保存するとすぐに、empID は他のメソッドで使用されます。
問題は、私が使用する場合:
Select max(empID)
多くのユーザーがレコードを挿入しているため、正しい empID が選択されません。
解決策として、SessionID を含む別の列を使用し、次のクエリを使用することだと思います。
Select max(empID) where sessionID = SessionID
これを行うためのより信頼できる方法はありますか?
**編集済み**
protected void btnSave_Click(object sender, EventArgs e)
{
Session.Add("TaskFlag", "New");
AddUpdateEmployee();
AddUpdateAddress();
}
protected void AddUpdateEmployee()
{
var db = new PetaPoco.Database("cnWeb");
var emp = new employee(); */
using (TransactionScope scope = new TransactionScope())
{
db.BeginTransaction();
emp.deptcode = txtEmpCode.Text.TrimEnd();
emp.empname = txtEmpName.Text.TrimEnd();
emp.guardianname = txtGuardian.Text.TrimEnd();
emp.relationwithemployee = ddlRelation.Text.TrimEnd();
emp.gender = ddlGender.SelectedItem.Text;
emp.dateofbirth = Convert.ToDateTime(txtDOB.Text.TrimEnd());
if (Session["TaskFlag"].ToString() == "New")
db.Insert(emp);
else if (Session["TaskFlag"].ToString() == "Update")
db.Update<employee>("SELECT * FROM employee WHERE empid = @0", Session["EmployeeID"]);
reuse.CustomClientMessage("Record Saved", this.Page);
ClearFields();
/* Commit Transaction */
db.CompleteTransaction();
scope.Complete();
}
}
protected void AddUpdateAddress()
{
var db = new PetaPoco.Database("cnWeb");
var addr = new emp_address();
using (TransactionScope scope = new TransactionScope())
{
db.BeginTransaction();
/* Permanaent Address */
addr.perm_houseno = txtPermHouse.Text.TrimEnd();
addr.perm_street = txtPermStreet.Text.TrimEnd();
addr.perm_place = txtPermCity.Text.TrimEnd();
addr.perm_pincode = txtPermPincode.Text.TrimEnd();
addr.perm_landlinephone = txtPermLandline.Text.TrimEnd();
addr.perm_mobilephone = txtPermMobile.Text.TrimEnd();
if (Session["TaskFlag"].ToString() == "New")
db.Insert(addr);
else if (Session["TaskFlag"].ToString() == "Update")
db.Update<emp_address>("SELECT * FROM emp_address WHERE empid = @0", Session["EmployeeID"]);
/* Commit Transaction */
db.CompleteTransaction();
scope.Complete();
}
}