我正在使用ASP.NET 4.0与SQL Server 2008 R2和PetaPoco ORM。
Web表单由选项卡面板组成,例如:
- 员工一般信息
- 预约
- 教育
每个选项卡面板条目都转到SQL Server中的特定表。我有一个主表,员工,主键为empID。其他表格,即任命,教育等与empID有关。
我有多种方法可以在各自的表中保存记录:
AddGeneralInformation 保存“常规信息”选项卡面板记录。
AddAppointment 会保存约会详情等。
该应用程序正在多个用户插入或更新记录的并发环境中使用。
对于插入新记录的第二种和第三种方法,方法必须具有正确的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();
}
}
答案 0 :(得分:2)
最佳解决方案:在SQL Server中将EmpID
列设为INT IDENTITY
,让数据库处理详细信息。
你在代码中想到的任何事情(T-SQL或C#)很可能会遇到一些问题而且在负载下也不会很好 - 为什么不只是使用那些,工作,并且经过成千上万的测试用户?
在使用INT IDENTITY
列的表格中插入行后,您可以使用
DECLARE @NewEmpID INT
SELECT @NewEmpID = SCOPE_IDENTITY()
或者,您可以在OUTPUT
声明
INSERT
子句
INSERT INTO dbo.YourTableHere(List of columns)
OUTPUT Inserted.EmpID
VALUES(list of value here)
答案 1 :(得分:0)
在表Employee General Information中创建一个像created_date
这样的新列,其中包含datetime并获取最新记录。
尝试此程序
create Procedure Get_LastRow
(
-- Table name to retrieve last record
@Tname Varchar(50)
)
AS
BEGIN
EXECUTE ('DECLARE GETLAST CURSOR DYNAMIC FOR SELECT * FROM ' + @Tname)
OPEN GETLAST
FETCH LAST FROM GETLAST
CLOSE GETLAST
DEALLOCATE GETLAST
END
执行这样的程序。
EXEC Get_LastRow 'dbo.TableA'
答案 2 :(得分:-1)
在插入查询之后,您将 SELECT @@ IDENTITY 。您的字段EmpID需要是IDENTITY才能工作。