2013-05-03 48 views
-1

我想在用戶運行時插入到具有唯一字段的表中。
例如:插入到SQL從C#重複記錄錯誤

  • b是唯一字段。
  • 在我的c#代碼中,我正在這樣做;
  • get_max(b);
  • y = b + 1;
  • insert into table1(a,b,c,d)values(@x,@y,@z,@t)
  • 但是當我想插入時用戶正在使用這個表。所以我看到「b」字段有重複的記錄錯誤。

我可以在插入前分配一些記錄嗎?我該怎麼辦?

+1

查找到SQL鎖定:http://msdn.microsoft.com/en-us/library/aa213039(v=sql.80).aspx和http://www.sqlteam.com/article/引入鎖定在SQL服務器 – Melanie 2013-05-03 21:18:14

+0

我看到獨佔鎖(X)。對於插入,更新和刪除操作,我可以使用它。但我如何在C#中使用? – user2348397 2013-05-03 22:13:19

+0

我不是這方面的專家;事實上,我從來沒有使用它。我相信你會想要使用一個存儲過程實現鎖定並從你的C#代碼中調用存儲過程。但是你可能想特意在SO上發佈另一個問題。對不起,我不能有更多的幫助。 – Melanie 2013-05-06 14:07:03

回答

2

在插入之前,您不能分配記錄,您必須鎖定表或將插入放在帶有重試邏輯的try catch塊之外。例如

;

int maxRetries = 3; 

for (int i = 0; i < maxRetries; i++) 
} 
    try 
    { 
     //insert 
     break; 
    } 
    catch (Exception e) 
    { 
     y = get_max(b) + 1; //get the max again since the failure is due to 
     // another record incrementing that value 
     if (i == maxRetries - 1) 
      throw e; 
     // all retries failed so it's time for that exception to bubble up 
    } 
} 
+0

好的。我必須將此行寫入SQL。所以我可以給maxRetries字段寫太大的值。這是真的? – user2348397 2013-05-03 22:01:47

+0

@ user2348397我不明白你的意思。 maxRetries是代碼在拋出異常之前嘗試插入行的次數。如果插入成功,它會從循環中斷開。 maxRetries可以是任何整數。如果你願意的話,你可以做到1000。 – evanmcdonnal 2013-05-03 22:30:57