2010-07-06 1 views
0

MySQL 서버 측과 XML 스키마 파일에서로드 된 ADO.NET 스키마 측에서 AutoIncrement가 활성화 된 ID 열이있는 DataTable이 있습니다. 그들의 유일한 사용은 테이블에 대한 기본 키를 가지고 있기 때문에 행을 삽입 할 때 이러한 ID를 신경 쓰지 않아도됩니다. 외부 키 참조가 없습니다. 그러나 DataTable은 새 행이 추가 될 때 이미 행을 포함합니다. 이자형. 1부터 시작하는 ID를 가진 행은 이미 DataTable에 있습니다.AutoIncrement가있는 DataTable.Rows.Add에 대한 ConstraintException

ID 열에 대한 기본 AutoIncrementSeed 값은 -1이고 AutoIncrementStep 값은 1입니다 (Visual Studio에서 제공 한 기본값 그대로). dataTable.NewRow()로 생성 될 때 ID가 -1과 0이되기 때문에 모든 것이 한 번에 두 개의 새 행을 삽입하기 만하면됩니다. 그러나 세 번째 행을 추가하려면 ID를 가져옵니다. 1 NewRow()가 배정 받았습니다. IDT = 1 인 행이 이미 있으므로 dataTable.Rows.Add (...)와 함께 새 행을 삽입하려고하면 ConstraintException이 throw됩니다.

ADO.NET의 AutoIncrement 항목을 사용하지 않도록 설정한다고 가정합니다. 스키마는 솔루션이 아닙니다. 왜냐하면 .Rows.Add()를 사용하여 행을 추가하기 전에 ID가 고유하다는 것을 확신해야하기 때문입니다.

이 문제를 쉽고 세련되게 해결할 수있는 방법은 무엇입니까? 지금은 이것이 매우 드문 일이라는 것을 상상할 수 없습니다.

감사합니다.

답변

1

아주 간단한 방법 : 당신은 다른 행을 추가하기 전에 고유의 열 값이 이미 테이블에 선택하여 존재하는지 여부를 확인할 수 있습니다 감소 즉, -1, -2, -3,이 도움 등

희망, 스티브

0

아래 제공된 예제와 비슷한 것을 시도해 볼 수 있습니까? 다음 아이디 -뿐만 아니라 -1로 AutoIncrementStep 속성을 설정 이러한 문제를 해결하기

using (SqlConnection connection = new SqlConnection(sqlConnectionStr)) 
     { 
      connection.Open(); 
      // Do work here. 
      DataTable userTable = new DataTable("usertable"); 

      using (SqlCommand sqlCmd = new SqlCommand("select * from [user]")) 
      { 
       sqlCmd.Connection = connection; 
       SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCmd); 
       dataAdapter.Fill(userTable); 
      } 

      int newUserId = 3; 
      DataRow[] selectedRows = userTable.Select( string.Format("id={0}", newUserId)); 
      bool userIdAlreadyTaken = selectedRows.Length > 0 ; 
      if(!userIdAlreadyTaken) 
      { 
       // Add new user 
       DataRow newRow = userTable.Rows.Add(new object[] { 3, "John" }); 
      } 
     } 
+0

는 귀하의 회신을 주셔서 감사합니다,하지만 난 다른 뭔가를 찾고 있었다 생각합니다. 귀하의 접근 방식은 효과가 있지만 내 목표는 더 이상 ID를 지정하거나 확인하지 않아도되도록 조정하는 것이 었습니다. SQL INSERT 문에 ID가 언급되어 있지 않으므로 중요한 "오프라인"ID는 절대로 MySql 데이터베이스에 저장되지 않습니다. 그래서 나는 그들없이 "일할 수있는 방법이있을 것이라고 생각했다. – JayK