如何选择最近插入的当前会话记录ID?

时间:2012-05-18 11:58:00

标签: asp.net sql-server sql-server-2008-r2 asp.net-4.0

我正在使用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();
    }

}

3 个答案:

答案 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才能工作。