2

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();
    }

}
4

3 に答える 3

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)
于 2012-05-18T12:00:15.240 に答える
0

created_dateテーブルEmployeeGeneralInformationに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

Insert クエリの直後に、SELECT @@IDENTITYを実行します。フィールド EmpID は IDENTITY TO である必要があります。

于 2012-05-18T12:04:34.510 に答える