2012-04-10 49 views
0

我有一個Web應用程序寫入多個數據庫以跟蹤員工變更請求。我遇到了一個加入新員工的問題。它們首先被寫入主要Employee數據庫,然後它們的訪問信息被寫入其他數據庫,其中EMP_ID是主鍵。當它去寫入其他數據庫EMP_ID已被生成,所以它被輸入爲0.檢查主鍵分配

爲了解決這個問題,我試圖循環並檢查EMP_ID值,直到產生一個值,但我繼續得到卡在一個循環中,因爲查詢返回沒有找到值。

while (int.Parse(empIDChecker) == 0) 
{ 
    dbConnection.Open(); 
    validateIDSQLString = "SELECT EMP_ID FROM EMPLOYEE_TABLE WHERE FIRST_NAME = '" +  firstNameTextBox.Text.Trim() + "' AND LAST_NAME = '" + lastNameTextBox.Text.Trim() + "'"; 

    SqlCommand updateSQLCmd = new SqlCommand(validateIDSQLString, dbConnection); 
    SqlDataReader getRecords = updateSQLCmd.ExecuteReader(); 

    try 
    { 
     empIDChecker = getRecords["EMP_ID"].ToString(); 
    } 
    catch 
    { 
     empIDChecker = "0"; 
    } 

    getRecords.Close(); 
    dbConnection.Close(); 
} 
+3

如何產生的EMP_ID - 它是一個自動遞增的關鍵?如果是這樣,你需要從插入語句返回這個 - 在插入之後應該像SELECT SCOPE_IDENTITY()那樣做。 – Paddy 2012-04-10 14:38:12

+5

P.S.你也應該看看這個:http://stackoverflow.com/questions/601300/what-is-sql-injection – Paddy 2012-04-10 14:39:03

+0

你使用多個數據庫或多個表。如果他們是多個數據庫,那麼我認爲使用自動增量ID不是一個好主意 – Habib 2012-04-10 14:40:11

回答

1

好吧,所以如果你插入sproc看起來像這樣:

sp_InsertEmp 
... 

INSERT INTO Emp(Name, etc...) 
VALUES ('Paul', etc...) 

SELECT SCOPE_IDENTITY() AS EMP_ID 

GO 

並在代碼:

SqlCommand insertCmd = new SqlCommand("sp_InsertEmp", dbConnection); 

    ... Add parameters here and set type to StoredProcedure 

    SqlDataReader dr= insertCmd.ExecuteReader(); 
    int newId; 

    if (dr.Read()) 
    { 
    newId = dr.GetInteger(0); 
    } 
+0

在執行此代碼時,我不斷收到此錯誤:「無數據存在時嘗試讀取無效。」我無法弄清楚爲什麼。查詢字符串是正確的,它返回我在管理工作室中需要的數據。 – Spacemancraig 2012-04-10 16:25:48

+0

如果您將一些代碼作爲編輯發佈在您的問題中,我們可以看看。 – Paddy 2012-04-11 06:58:43

+0

這只是一個簡單的例子。它實際上從我發佈的當前代碼中遺漏了。我忘了實際上。閱讀()數據... – Spacemancraig 2012-04-11 14:36:15

1

可以使用

SELECT IDENT_CURRENT(‘tablename’) 

這會給你的表的最後插入自動增量ID,您可以使用在其他表中插入

檢查此鏈接,以及http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

+0

如果您查看該文章,您會發現它始終使用SCOPE_IDENTITY() - 上面的行將返回插入到該表中的最後一個標識值,而不管範圍/會話。如果你同時運行兩次proc,你會在某個時候遇到競爭狀況。 – Paddy 2012-04-11 07:00:21