2

我正在使用带有 SQL Server 2008 R2 和 PetaPoco ORM 的 ASP.NET 4.0。

Web 表单由选项卡面板组成,例如:

-- 员工一般信息

- 约定

- 教育

每个选项卡面板条目都转到 SQL Server 中的特定表。我有一个主表employee,主键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();
    }

}
4

3 回答 3

2

最佳解决方案:将您的EmpID列设为INT IDENTITYSQL Server 并让数据库处理详细信息。

您在代码中梦想的任何东西(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)
于 2012-05-18T12:00:15.240 回答
0

created_date在 Employee General Information 表中创建一个新列,如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'
于 2012-05-18T12:08:43.237 回答
-1

就在插入查询之后,您是SELECT @@IDENTITY。您字段 EmpID 需要是 IDENTITY 才能工作。

于 2012-05-18T12:04:34.510 回答