簡體   English   中英

在C#中使用自動生成ID的中間行中刪除

[英]Delete in the middle row where the id using auto generate in C#

我在sql server 2005中創建了一個數據庫,並使用了count all rows table來創建帶有自動生成id字段的表。

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

我有一個問題,如果我在通過編碼C#自動生成ID的數據庫中刪除1行表,我如何設置像ID這樣的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;
}

你不知道
我建議讓SQL服務器為您分配ID(使用identity屬性 )。

自動生成ID字段的表格

干得好。 身份字段不計算行,在元數據表中有一個單獨的計數器。

因此,在插入4之后,您將獲得5-不管4或任何其他行是否仍然存在或已被刪除。

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

您的設計非常糟糕。

問題被殘酷地說:*不計算,使用max *,然后-如何由多個用戶/線程同時處理多個插入?

通常,您要查找的是序列,應該在數據庫中實現該序列並要求輸入下一個數字。 在Sql Server 2012中不重要-使用(新)序列。 使用2005,您應該將自己的最后一個值放在單獨的表中的某個字段中。

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

描述了自定義序列的各種方法。

您不應該使用這種方法來生成密鑰,因為正如您自己所看到的那樣,它會導致各種問題。

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

如果要自動生成的密鑰,最簡單的操作是使用標識列:

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

現在,當您想插入上表時,只需使用INSERT INTO MyTable(SomeData) Values ('hello world') ,ID列將自動分配而不會發生沖突。

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

更新 :有關您正在使用的密鑰的小注釋。

我建議不要使用看起來像'ACT00001'或類似名稱的主鍵,因為盡管這很有意義(ACTivity,非常聰明), 但實際上您將自己陷於困境-如果企業在6個月的時間內決定“活動”真正應該被稱為“任務”,那么您就被一堆看上去很奇怪的標識符所困,這些標識符無法輕易更改。

現在最好還是使用數字標識符,您可以隨時將其格式化以在演示文稿代碼中顯示“ ACT00001”,依此類推。

標識列受到了糟糕的說唱恕我直言,我不明白為什么不應該在您的情況下使用它們,或者您也可以使用序列編輯:我注意到您正在使用SQL Server 2005,因此實際上是不可能的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM