2014-02-11 14 views
0

我已經在SQL Server 2005中創建了一個數據庫,並且使用count all rows table在一個包含自動生成ID字段的表中創建了一個數據庫。刪除在C#中使用自動生成的ID的中間行

另外我在c#桌面應用程序中開發一個項目。

我有一個問題,如果我刪除數據庫中的1行表,其中的id是通過編碼c#自動生成的,我如何設置自動生成id像id已被刪除? 因爲在我刪除字段的同時,所有行的數量都減少了,我的數量也增加了。

所以,我的自動生成id是錯誤的,因爲id是衝突的。

這是我的自動生成的ID

public string generateIdActivity() 
{ 
    string activity = ""; 
    int jml = myActivity.getCountActivity() + 1; 
    if (myActivity.getCountActivity() < 10) 
    { 
     activity = "ACT0000" + jml; 
    } 
    if (myActivity.getCountActivity() < 100 && myActivity.getCountActivity() > 9) 
    { 
     activity = "ACT000" + jml; 
    } 
    if (myActivity.getCountActivity() < 1000 && myActivity.getCountActivity() > 99) 
    { 
     activity = "ACT00" + jml; 
    } 
    if (myActivity.getCountActivity() < 10000 && myActivity.getCountActivity() > 999) 
    { 
     activity = "ACT0" + jml; 
    } 
    if (myActivity.getCountActivity() < 100000 && myActivity.getCountActivity() > 9999) 
    { 
     activity = "ACT" + jml; 
    } 
    return activity; 
} 
+1

我知道什麼評論與這裏提出的問題無關。但是這段代碼可以是即興創作的。您正在多次調用函數myActivity.getCountActivity()。這是不必要的開銷。你可以將值保存到變量並使用它,或者你可以使用變量(jml - 1)..這將即興代碼..它的只是暗示。 –

回答

1

你不知道。
我建議讓SQL服務器爲您分配標識(使用identity property)。

+0

壞主意。永遠不要讓身份資產生成業務級別編號方案。可能還有其他要求 - 比如沒有漏洞,哪些身份不能保證(但例如法律要求的發票號碼)。你需要一個自定義序列。而SQL 2005意味着必須進行編程。 – TomTom

+4

@TomTom - 誰說這是產生「商業級」編號方案?在商業環境中使用主鍵(如發票號碼)是不好主意,並且依賴連續的密鑰序列更糟糕。 –

+0

@StephenByrne他的活動Id不是純數字,而是以前綴開頭。而使用商業密鑰作爲主鍵非常好 - 有一整套思想在sql中討論自然鍵。不是我喜歡它......但是誰說主鍵。唯一索引具有相同的問題。請考慮你的陳述。 – TomTom

0

表自動生成的ID字段

在這裏你去。標識字段不計數行,元數據表中有一個單獨的計數器。

因此,在插入4之後,您會得到5 - 無論4或任何其他行是否仍然存在或已被刪除。

但是:您沒有自動生成Id字段。

你有一個非常糟糕的設計。

問題是殘酷地說: *不計算,使用最大 *,但然後 - 如何處理多個用戶/線程同時插入多個插入?

一般來說,你正在尋找的是一個應該在數據庫中實現的序列,並詢問下一個數字。 Sql server 2012中的微不足道 - 使用(新)序列。與2005年一樣,你應該把自己的最後一個價值放在一個單獨的表格的某個領域。

http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server

介紹了自定義序列的各種方法。

0

您不應該使用這種方法來生成密鑰,因爲正如您已經看到自己,它會導致各種問題。

請考慮如果您的應用程序的兩個或多個實例嘗試同時插入記錄時可能發生的情況 - 它們最終都會在表中獲得相同數量的記錄,並且都會嘗試發送相同的ID 。

如果你想要一個自動生成的密鑰,以最簡單的做法,就是用一個標識列:當你想插入到表上方

CREATE TABLE MyTable 
(
    ID int identity primary key, 
    SomeData nvarchar(255) 
) 

現在,你只需要使用 INSERT INTO MyTable(SomeData) Values ('hello world')和ID列將自動分配,不會發生衝突。

您可以使用SELECT SCOPE_IDENTITY()從特定連接中檢索上次生成的標識,以便您可以知道剛剛插入的記錄的標識。

更新:關於您正在使用的密鑰的小記事。

我會建議對一個主鍵,看起來像「ACT00001」或類似的,因爲雖然現在它是有道理的(活動,非常聰明),你實際上是畫自己逼到牆角 - 如果企業決定在6一個月的時間裏,「活動」真的應該被稱爲「任務」,那麼你堅持與一堆奇怪的外觀標識符,你不能輕易改變。

現在更好地堅持使用數字標識符,您可以始終使用格式它將在演示文稿代碼中顯示「ACT00001」等。我不明白爲什麼他們不應該用在你的情況下,或者你也可以使用sequence編輯:我注意到你使用的是SQL Server 2005這實際上是不可能的

+0

有趣的是,他從不說主鍵。我有一個數據庫模式,在大多數名爲Code的表中有一個唯一的ID字段,有些必須遵循一些自動生成的機制(例如發票號)。 Id不會自動暗示主鍵 - 唯一的索引觸發相同的行爲。 – TomTom

+0

@TomTom是的我想我也犯了假設:) –

相關問題