2012-04-10 2 views
2

일부 열이있는 테이블이 있으며 해당 열 중 3 개에 고유 키를 설정하여 중복이 없는지 확인했습니다. 탁자. 이제 시도를 사용하여 catch 예외를 던지기 중복 및 다음 행을 삽입하는 계속 업데이트 궁금한 것 foreach 갈 좋은 방법은 무엇입니까?데이터의 무결성을 확인하는 유효한 방법으로 try/catch를 사용하거나 사용하지 않는 SQL에서 고유 키 사용

  try { 
       sqlWrite.ExecuteNonQuery(); 
      } catch (SqlException sqlException) { 
       if (!sqlException.ToString().Contains("Violation of UNIQUE KEY constraint")) { 
        MessageBox.Show("Error - " + Environment.NewLine + sqlException.ToString(), "Error SQL"); 
       } 
      } catch (Exception exception) { 
       MessageBox.Show("Error - " + Environment.NewLine + exception.ToString(), "Error SQL"); 
      } 

행이 있는지 삽입 삽입을 건너 뛸 경우 삽입 쿼리에서 SELECT를 수행해야합니까? 나는 당신의 데이터 검증의 일부로 예외를 사용하는 것이 좋지 않다는 것을 읽었지만, 어떤 것들은 그렇게 사용되어야한다고 생각한다. (예를 들어, How to check For File Lock in C#?은 try/catch와 함께 사용되어야한다.)

+1

http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/ –

+0

감사합니다. 그것을 읽을 것입니다. – MadBoy

답변

1

다른 방법이 있다면 예외를 던지거나 잡아서는 안됩니다. 너는 이제 너와 함께있어. 그걸 써!

IF NOT EXISTS(SELECT ...)을 검사하고 삽입하는 단일 SQL 스크립트 또는 저장 프로 시저를 만들 수 있습니다. 두 개의 쿼리를 만드는 속도가 느립니다.

+0

그는 실제로 예외를 던지지 않고 있습니다. 나는 예외를 예외 상황에 대해있다 : – mattytommo

+0

그는 명시 적으로 던지고 있지 않지만 간접적으로 그것을 던지고있다 ... 그냥 의미의 그늘 : – JotaBe

+0

hehe 그냥 nitpicking :), 그는 그것을 던지고, 그것을 던지고, 직접 또는 간접적으로 :) – mattytommo

0

일반적으로 기본 키 관계는 데이터 검증을위한 절대 마지막 마지막 위치 여야합니다. 프로그램이 그렇게 멀리 떨어져 있고 고유 한 키에 실패한 행을 삽입하려고하면 뭔가 잘못되었습니다.

가장 간단한 경우에 그렇게 나쁘지 않습니다. 다른 의존성없이 단일 행을 삽입하려면 레코드를 삽입하고 catch 오류를 던지는 인수가 더 효율적일 수 있으며 select를 수행하여 ID가 ​​이미 있는지 확인할 수 있습니다.

이제는 10 초 또는 수백 개의 행을 한 번에 삽입/업데이트 할 수있는 트랜잭션에 대해 생각해보십시오. 모든 행에는 고유 키가 있으며 그 중 하나는 오류를 발생시킬 수 있습니다. 그런 다음 DB는 오류가 잡히면 전체 트랜잭션을 롤백해야합니다. 물론 C#에는 트랜잭션 모드가 있지만 레코드를 삽입 할 때 DB를 롤백하고 업데이트 된 모든 객체를 롤백해야합니다. 매우 복잡해집니다.

+0

감사합니다. 그래서 나는 try/catch 어쨌든 떠나지 만 JotaBe가 제시 한 것이 없다면 그것을 수행 할 것입니다. – MadBoy

관련 문제