2017-06-15 37 views
1

我想在具有整數作爲主鍵的表中插入數據。主鍵將被廣泛的隨機數添加。首先,我想檢查主鍵是否存在,然後插入它。在SQL服務器表中添加一個不存在的主鍵

這裏是我的代碼:

public static void Insert() 
    { 
     bool a=true; 

     while (a != false) 
     { 


      try 
      { 
       db.test.Add(new test() //insert into test table new data 
       { 

        Id = rand.Next(1, 10), 
        name = "test", 
        surname = "test" 
       }); 

       db.SaveChanges(); 
       a=false; 
      } 
      catch (Exception) 
      { 

       Console.WriteLine("Duplicate"); 

      } 


     } 
    } 

在第一次迭代如果數字不重複的,我可以順利插入新行的數據庫。如果在第一次迭代中它是在db.SaveChanges();後直接跳入catch中的重複項。但問題出現在第二次迭代時,隨機數不重複,它仍然跳轉以捕獲異常而不執行a=false代碼行。

任何想法?

注意:我對使用GUID或任何其他數據類型不感興趣。

+1

不要插入自己的PK。改用身份,讓數據庫生成id。 –

+0

@ User.Anonymous我對這個解決方案也不感興趣。 –

+0

@MrASD那麼......例外*說什麼*?另外:這是否發生*檢測到重複之後?因爲如果它第一次不能插入它,它仍然會作爲對'db'的一個改變來計算,所以它會嘗試(並且失敗)從那以後每插入一次* –

回答

2

如果你不需要它是一個隨機數,我可能會有一個更簡單的解決方案。

CREATE TABLE Persons (
    ID int IDENTITY(1,1) PRIMARY KEY, 
    Surname varchar(255) NOT NULL, 
    Name varchar(255) 
); 

INSERT INTO Persons (Name,Surname) 
VALUES ('Lars','Monsen'); 

這種方式,你甚至都不需要做的事情PRIMARY KEY,SQL Server將處理它爲您服務!

+0

引用OP對User.Anonymous的回覆:「我對這個解決方案也不感興趣」 - 儘管如此,我完全同意你的看法。這是做主密鑰生成的正確方法 –

+0

我只是在摸索我的腦海中想要做什麼解決方案。另外,我沒有看到OP對此帖的評論。 –

+1

我知道你的意思。我感到有點內疚,因爲我顯然已經解決了他們的問題。爲了轉向隱喻,感覺就像有人正在用自己的腳指着一支獵槍並且無法使它燃燒,我剛剛向他們展示瞭如何釋放安全。嘆。 –

2

這裏的問題是,一旦生成重複密鑰,它將無法插入,所以它會保持試圖每次都插入它;引用OP:

是的,當它檢測到重複時,它會繼續嘗試,即使下一個數字可能不重複。

有解決這個的3個主要方面:

  1. 不會產生自己的鑰匙;對不起,但這是最簡單,最明顯,最可支持的機制; IDENTITY是你的朋友
  2. 如果你無法插入的東西:從你的ORM上下文中刪除相同的東西,所以你不保持失敗;大概有一個db.test.Remove方法就足夠了;你也可能只是改變最後一行的值,濫用你知道這是最後一行失敗的事實:db.test.Last().Id = newId; - 雖然這很奇怪,如果您更改身份密鑰,所有內容都會變得很奇怪
  3. 或者在失敗後不會重複使用數據上下文;假設db現在在異常之後不可用,併爲任何後續操作創建一個新的;國際海事組織這應該由相同的代碼,最初創建數據庫的上下文,在「重做從開始」的方式
+0

瞭解感謝你,數據庫本身不可用,幫助我瞭解發生了什麼。我選擇了你的選項3,現在一切正常。謝謝! –

相關問題