[C#] 제약 조건을 활성화하지 못했습니다. 하나 이상의 행에 null이 아니거나 고유하거나 외래 키 제약 조건을 위반하는 값이 있습니다.

외부 조인을 만들어 informix데이터베이스 에서 성공적으로 실행 했지만 내 코드에서 다음 예외가 발생합니다.

DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat);

제약 조건을 활성화하지 못했습니다. 하나 이상의 행에 null이 아니거나 고유하거나 외래 키 제약 조건을 위반하는 값이 있습니다.

문제를 알고 있지만 해결 방법을 모르겠습니다.

외부 조인을 수행하는 두 번째 테이블에는 이전 외부 조인 쿼리에서 null 인 복합 기본 키가 포함되어 있습니다.

편집하다:

    SELECT UNIQUE a.crs_e,  a.crs_e  || '/ ' || a.crst crs_name, b.period,
           b.crscls, c.crsday, c.from_lect, c.to_lect,
           c.to_lect - c.from_lect + 1 Subtraction, c.lect_kind, e.eval, e.batch_no,
           e.crsnum, e.lect_code, e.prof_course
    FROM rlm1course a, rfc14crsgrp b, ckj1table c, mnltablelectev d,
         OUTER(cc1assiscrseval e)
    WHERE a.crsnum = b.crsnum
    AND b.crsnum = c.crsnum
    AND b.crscls = c.crscls
    AND b.batch_no = c.batch_no
    AND c.serial_key = d.serial_key
    AND c.crsnum = e.crsnum
    AND c.batch_no = e.batch_no
    AND d.lect_code= e.lect_code
    AND d.lect_code = ....
    AND b.batch_no = ....

테이블에서 문제가 발생합니다 cc1assiscrseval. 기본 키는 (batch_no, crsnum, lect_code)입니다.

이 문제를 해결하는 방법?


편집하다:

@PaulStock조언 에 따르면 : 나는 그가 말한 것을하고, 나는 얻는다 :

? dt.GetErrors () [0] {System.Data.DataRow} HasErrors : true ItemArray : {object [10]} RowError : “열 ‘eval’은 DBNull.Value를 허용하지 않습니다.”

으로 교체 e.eval하여 문제를 NVL (e.eval,'') eval해결하면 문제가 해결됩니다. 고마워



답변

이 문제는 일반적으로 다음 중 하나에 의해 발생합니다.

  • AllowDBNull로 설정되지 않은 열에 대해 null 값이 반환 됨
  • 동일한 기본 키로 리턴되는 중복 행
  • 데이터베이스와 데이터 세트 사이의 열 정의 불일치 (예 : char 필드의 크기)

쿼리를 기본적으로 실행하고 결과 집합이 너무 크지 않은 경우 결과를 확인하십시오. null 값을 제거했다면 기본 키 열이 복제되는 것 같습니다.

또는 정확한 오류를 확인하기 위해 생성 된 코드에 Try / Catch 블록을 수동으로 추가 한 다음 예외가 발생하면 중단 될 수 있습니다.

여기에 이미지 설명을 입력하십시오

그런 다음 명령 창 GetErrors에서 오류가 발생하는 테이블에서 메소드를 호출 하십시오.
C #의 경우 명령은 ? dataTable.GetErrors()
VB의 경우 명령은? dataTable.GetErrors

여기에 이미지 설명을 입력하십시오

오류가있는 모든 데이터 행이 표시됩니다. 그런 다음 RowError각각에 대해 를 살펴볼 수 있으며 문제와 함께 유효하지 않은 열을 알려줍니다. 따라서 오류가 발생한 첫 번째 데이터 행의 오류를 보려면 명령은 다음
? dataTable.GetErrors(0).RowError
과 같습니다. 또는 C #에서는? dataTable.GetErrors()[0].RowError

여기에 이미지 설명을 입력하십시오


답변

데이터 세트에 대한 제약 조건을 비활성화 할 수 있습니다. 잘못된 데이터를 식별하고 문제를 해결하는 데 도움이됩니다.

예 :

dataset.TableA.Clear();
dataset.EnforceConstraints = false;
dataAdapter1.daTableA.Fill(dataset, TableA");

채우기 방법이 약간 다를 수 있습니다.


답변

테이블에 오류가있는 모든 행을 찾고 행의 기본 키와 해당 행에서 발생한 오류를 인쇄합니다.

이것은 C #에 있지만 VB로 변환하는 것은 어렵지 않습니다.

 foreach (DataRow dr in dataTable)
 {
   if (dr.HasErrors)
     {
        Debug.Write("Row ");
        foreach (DataColumn dc in dataTable.PKColumns)
          Debug.Write(dc.ColumnName + ": '" + dr.ItemArray[dc.Ordinal] + "', ");
        Debug.WriteLine(" has error: " + dr.RowError);
     }
  }

죄송합니다. PKColumns는 DataTable의 기본 키를 구성하는 모든 열을 알려주는 DataTable을 확장 할 때 추가 한 것입니다. 데이터 테이블의 기본 키 열을 알고 있다면 여기에서 반복 할 수 있습니다. 필자의 경우 모든 데이터 테이블이 PK 열을 알고 있기 때문에 모든 테이블에 대해 이러한 오류에 대한 디버그를 자동으로 작성할 수 있습니다.

결과는 다음과 같습니다.

Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J',  has error: Column 'HAIR_COLOR' does not allow DBNull.Value.

위의 PKColumns 섹션에 대해 혼란 스러우면 열 이름과 값을 인쇄하지만 필요하지는 않지만 문제를 일으키는 열 값을 식별하는 데 도움이되는 문제 해결 정보를 추가합니다. 이 섹션을 제거하고 나머지를 유지하면 여전히 생성되는 SQLite 오류가 인쇄되어 문제가있는 열을 기록합니다.


답변

  • 테이블 어댑터 조회에 이름 지정된 필드가 정의한 조회의 필드와 일치하는지 확인하십시오. DAL이 일치하지 않는 것 같습니다. 이것은 일반적으로 테이블에 새 필드를 추가 한 후 sprocs 및 쿼리에서 발생합니다.

  • 데이터베이스에서 varchar 필드의 길이를 변경했지만 XSS 파일에 포함 된 XML에서 선택하지 않은 경우 XML에서 필드 이름 및 속성 정의를 찾아서 수동으로 변경하십시오.

  • 리턴되는 데이터와 관련이없는 테이블 어댑터의 선택 목록에서 기본 키를 제거하십시오.

  • SQL Management Studio에서 쿼리를 실행하고 반환되는 중복 레코드가 없는지 확인하십시오. 중복 레코드는 중복 기본 키를 생성하여이 오류가 발생할 수 있습니다.

  • SQL 공용체는 문제를 일으킬 수 있습니다. 다른 직원 앞에 ‘직원을 선택하십시오’레코드를 추가하여 하나의 테이블 어댑터를 수정했습니다. 다른 필드의 경우 예를 들어 길이가 1 인 문자열을 포함하여 더미 데이터를 제공했습니다. DAL은 해당 초기 레코드에서 스키마를 유추했습니다. 문자열 길이가 12 인 레코드는 실패했습니다.


답변

이것은 나를 위해 일했다. here

이 오류가 발생했으며 DB 제약과 관련이 없습니다 (적어도 내 경우에는). 레코드 그룹을 반환하는 GetRecord 쿼리가있는 .xsd 파일이 있습니다. 해당 테이블의 열 중 하나는 “nvarchar (512)”이고 프로젝트 중간에 “nvarchar (MAX)”로 변경해야했습니다.

사용자가 해당 필드에 512 이상을 입력 할 때까지 모든 것이 제대로 작동했으며 “제약 조건을 활성화하지 못했습니다. 하나 이상의 행에 null이 아니거나 고유하거나 외래 키 제약 조건을 위반하는 값이 있습니다.”라는 유명한 오류 메시지가 나타납니다.

솔루션 : DataTable에서 열의 모든 MaxLength 속성을 확인하십시오.

“nvarchar (512)”에서 “nvarchar (MAX)”로 변경 한 열에는 여전히 MaxLength 속성에 512 값이 있으므로 “-1″로 변경되었으며 작동합니다.


답변

문제는 데이터 액세스 디자이너에 있습니다. Visual Studio에서 뷰를 “서버 탐색기”에서 디자이너 창으로 가져 오면 열에 기본 키가 무작위로 추가되거나 실제로 null로 설정되어 있지만 NOT NULL로 표시됩니다. SQL db 서버에서 실제보기 작성에는 기본 키가 정의되어 있지 않거나 NOT NULL이 정의되어 있지 않지만 VS 디자이너는이 키 / 제약을 추가합니다.

디자이너에서 이것을 볼 수 있습니다-열 이름 왼쪽에 키 아이콘이 표시됩니다.

해결 방법 : 키 아이콘을 마우스 오른쪽 버튼으로 클릭하고 ‘키 삭제’를 선택하십시오. 문제를 해결해야합니다. 열을 마우스 오른쪽 버튼으로 클릭하고 “속성”을 선택하여 VS 데이터 액세스 디자이너에서 열 속성 목록을보고 값을 적절히 변경할 수 있습니다.


답변

이 오류는 내 프로젝트에도 표시되었습니다. 여기에 게시 된 모든 제안 된 솔루션을 시도했지만 문제는 필드 크기, 테이블 키 필드 정의, 제약 조건 또는 EnforceConstraints 데이터 세트 변수와 관련이 없기 때문에 운이 없습니다.

필자의 경우 프로젝트 디자인 시간 (데이터 액세스 레이어)에 .xsd 객체도 넣었습니다. 데이터베이스 테이블 개체를 데이터 집합 시각적 항목으로 끌어다 놓으면 기본 데이터베이스에서 각 테이블 정의를 읽고 데이터베이스에 테이블을 만들 때 정의한대로 제약 조건을 데이터 집합 개체에 복사합니다 (SQL Server 2008 R2 in 케이스). 이는 “not null”또는 “foreign key”제한 조건으로 작성된 모든 테이블 열이 SQL 문 또는 스토어드 프로 시저의 결과에도 존재해야 함을 의미합니다.

모든 키 열과 “널이 아님”으로 정의 된 열을 쿼리에 포함시킨 후 문제가 완전히 사라졌습니다.