2010-06-17 134 views
0

我正在使用TableAdapter在循環中的表中插入記錄。如何避免重複鍵異常

foreach(....) 
{ 
    .... 
    .... 
    teamsTableAdapter.Insert(_teamid, _teamname); 
    .... 
} 

其中TeamID是表中的主鍵,_teamID將其插入。其實我從XML文件中提取數據,其中包含唯一的teamId

第一次運行此循環後,插入拋出重複主鍵發現異常。爲了解決這個問題,我做了這個

foreach(....) 
{ 
    .... 
    .... 

    try 
    { 
    _teamsTableAdapter.Insert(_teamid, _teamname); 
    } 
    catch (System.Data.SqlClient.SqlException e) 
    { 
    if (e.Number != 2627) 
     MessageBox.Show(e.Message); 
    } 
    .... 
    .... 
} 

但是使用try catch語句代價高昂,如何避免這個異常。我在VS2010工作和INSERT ... ON DUPLICATE KEY UPDATE不起作用。

我想避免嘗試catch語句並在不使用try catch語句的情況下處理它。

+6

避免插入重複的主鍵。 – 2010-06-17 13:29:29

回答

1

根據您對其他答案的評論,我建議將TeamID從主鍵(如果可能的話)和設置爲主鍵的新Idx列進行更改。然後,您可以在您的數據庫上設置一個觸發器,當插入一個帶有重複TeamID的新記錄時,會更新原始記錄並刪除新記錄。

如果這是不可能的,我會修改插入記錄的存儲過程,以便不首先插入,而是首先檢查重複的TeamID。如果沒有重複的記錄,記錄可以插入,否則它只會'選擇0'。

僞代碼示例:在代碼中,而不是的ExecuteNonQuery(

Declare @Count int 
Set @Count = (Select Count(TeamId) From [Table] where TeamId = @TeamId) 

If(@Count > 0) 
    Begin 
    Select 0 
    End 
Else 
--Insert Logic Here 

然後,你插入法),是的ExecuteScalar()。您的代碼將處理這個方式

If(_teams.TableAdapter.Insert(_teamId, _teamName) == 0) 
    { 
    _teams.TableAdapter.Update(_teamId, _teamName) 
    } 

另外,如果你只是想處理這一切在SQL(所以你的C#代碼沒有改變),你可以做這樣的事情:

Declare @Count int 
Set @Count = Select Count(TeamId) from [Table] Where TeamId = @TeamId 

If(@Count > 0) 
    Begin 
    //Update Logic 
    End 
Else 
    Begin 
    //Insert Logic 
    End 

但是,我只是修改表,如果這是一個選項。

1

您使用的表是否有主鍵?如果不是,則應該創建一個,因爲它可以防止重複記錄,並且可以更容易地訪問程序其他部分的密鑰。

通常這是通過一個標識列或類似的東西來完成的。 (它看起來像你可能已經在TeamID方面,在這種情況下,你只需要在SQL-MS或VS2010中將其更改爲主鍵)。

編輯:

轉到服務器資源管理器:要使用Visual Studio指定一個主鍵標識列(teamID在你的例子)。導航到相關表格。右鍵單擊「打開表格定義」。點擊主鍵列。滾動屬性窗口,直到達到「身份規格」。把它改爲「yes」(你可以將增量/種子設置爲你想要的值,通常1,1是很好的)。現在,您所要做的就是在表格中插入一個團隊名稱,並自動生成TeamID。

+0

是的,teamId是主鍵 – SMUsamaShah 2010-06-17 13:29:44

+1

是否將teamID設置爲標識列? (即自我生成,自動標記?) – 2010-06-17 13:31:17

+0

teamId是唯一的,我從xml文件中提取teamId,其中包含每個團隊的唯一teamId。 teamId本身是獨一無二的 – SMUsamaShah 2010-06-17 13:35:31

1

數據中有明顯重複的部分。要麼你需要先消除它們,要麼使用某種類型的合併語句,如果是新的,則使用isert;如果不是新的,則使用更新。

要查看造成問題的數據,運行分析器,同時從應用程序運行循環並查看實際發送的數據。這句話指出你正在複製哪條記錄。

如果這是一個大文件,批量插入(清理dups後)將比逐行處理更快。