我想在用戶運行時插入到具有唯一字段的表中。
例如:插入到SQL從C#重複記錄錯誤
- b是唯一字段。
- 在我的c#代碼中,我正在這樣做;
- get_max(b);
- y = b + 1;
- insert into table1(a,b,c,d)values(@x,@y,@z,@t)
- 但是當我想插入時用戶正在使用這個表。所以我看到「b」字段有重複的記錄錯誤。
我可以在插入前分配一些記錄嗎?我該怎麼辦?
我想在用戶運行時插入到具有唯一字段的表中。
例如:插入到SQL從C#重複記錄錯誤
我可以在插入前分配一些記錄嗎?我該怎麼辦?
在插入之前,您不能分配記錄,您必須鎖定表或將插入放在帶有重試邏輯的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
}
}
好的。我必須將此行寫入SQL。所以我可以給maxRetries字段寫太大的值。這是真的? – user2348397 2013-05-03 22:01:47
@ user2348397我不明白你的意思。 maxRetries是代碼在拋出異常之前嘗試插入行的次數。如果插入成功,它會從循環中斷開。 maxRetries可以是任何整數。如果你願意的話,你可以做到1000。 – evanmcdonnal 2013-05-03 22:30:57
查找到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
我看到獨佔鎖(X)。對於插入,更新和刪除操作,我可以使用它。但我如何在C#中使用? – user2348397 2013-05-03 22:13:19
我不是這方面的專家;事實上,我從來沒有使用它。我相信你會想要使用一個存儲過程實現鎖定並從你的C#代碼中調用存儲過程。但是你可能想特意在SO上發佈另一個問題。對不起,我不能有更多的幫助。 – Melanie 2013-05-06 14:07:03