2010-06-17 1 views
0

TableAdapter를 사용하여 루프 내의 테이블에 레코드를 삽입하고 있습니다.중복 키 예외를 피하는 방법

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

여기서 TeamID는 테이블의 기본 키이며 _teamID가 삽입합니다. 사실 고유 한 teamId가 포함 된 XML 파일에서 데이터를 추출합니다.

이 루프를 처음 실행하면 삽입시 중복 된 기본 키 발견 예외가 발생합니다. 이 문제를 처리하기 위해, 나는이

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

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

그러나 사용하여 시도의 catch 문이 예외를 방지하는 방법, 비용이 많이 드는 했어요. VS2010에서 작업 중이며 INSERT ... ON DUPLICATE KEY UPDATE이 작동하지 않습니다.

try catch 문을 사용하지 않고 catch 문을 시도하고 처리하지 않으려합니다.

+6

중복되는 기본 키를 삽입하지 마십시오. –

답변

1

다른 답변에 대한 귀하의 의견을 토대로 TeamID가 기본 키 (가능한 경우)에서 변경되고 새로운 Idx 열이 기본 키로 설정되도록 제안합니다. DB에 트리거를 설정할 수 있습니다. 새 레코드가 삽입되면 중복 된 TeamID가 원본 레코드를 업데이트하고 새 레코드를 삭제합니다.

그럴 수 없다면 레코드를 삽입하는 저장 프로 시저를 수정하여 삽입하는 대신 처음으로 중복 된 TeamID를 확인합니다. 중복 ID가 없으면 레코드를 삽입 할 수 있고, 그렇지 않으면 '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는합니다.

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 
: 당신은 그냥 SQL에서 모든 것을 처리하기를 원한다면 귀하의 코드는이 방법이

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

또는 처리 할 것입니다 당신이 이런 일을 할 수있는 (그래서 당신의 C# 코드는 변경하지 않음)

그러나 옵션 인 경우 다시 표를 수정합니다.

1

사용중인 테이블에 기본 키가 있습니까? 그렇지 않은 경우 중복 레코드를 방지하므로 프로그램의 다른 부분에 대한 키에 더 쉽게 액세스 할 수 있도록 만들어야합니다.

대개 이것은 식별 열 또는 이와 유사한 것으로 수행됩니다. (이미 TeamID의 관점에서 볼 수있는 것처럼 보입니다.이 경우 SQL-MS 또는 VS2010에서 기본 키로 만 변경하면됩니다).

편집 : 서버 탐색기에

이동 : 비주얼 스튜디오를 사용합니다 (예 teamID) ID 열 등의 기본 키를 지정합니다. 관련 테이블로 이동하십시오. "테이블 정의 열기"를 마우스 오른쪽 단추로 클릭하십시오. 기본 키 열을 클릭하십시오. "ID 사양"에 도달 할 때까지 속성 창을 스크롤하십시오. 이것을 "예"로 변경하십시오 (원하는/증가시킬 시드를 설정할 수 있습니다. 보통 1,1입니다). 이제 테이블에 팀 이름을 삽입하면 TeamID가 자동으로 생성됩니다.

+0

예, teamId가 기본 키입니다 – SMUsamaShah

+1

teamID가 ID 열로 설정되어 있습니까? (self-generating, auto-labelling?) –

+0

teamId는 독특합니다. 저는 각 팀마다 고유 한 teamId가 포함 된 xml 파일에서 teamId를 추출합니다. teamId 자체는 고유 한 것임 – SMUsamaShah

1

데이터에 명확한 중복이 있습니다. 둘 중 하나를 먼저 제거하거나 새로운 유형 인 경우 isert를 수행하거나 새로운 것이 아닌 경우 update를 수행하기 위해 일부 유형의 병합 statment를 사용해야합니다.

어떤 데이터가 문제를 일으키는 지 확인하려면 응용 프로그램에서 루프를 실행하는 동안 프로파일 러를 실행하여 실제로 구문이 표시되는지 확인하십시오. 그 소리는 어떤 레코드가 중복되는지를 알려줍니다.

큰 파일 인 경우 dups를 삭제 한 후에 대량 삽입은 행 단위 처리보다 빠릅니다.