programing

제약 조건을 사용하도록 설정하지 못했습니다.하나 이상의 행에 null이 아니거나 고유하거나 외래 키 제약 조건을 위반하는 값이 포함되어 있습니다.

lovejava 2023. 5. 24. 21:22

제약 조건을 사용하도록 설정하지 못했습니다.하나 이상의 행에 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("crsnum, crsnum, lect_code")는 다음과 같습니다.

이 문제를 어떻게 해결합니까?


편집:

에 의하면@PaulStock例언:대로 , 을 얻습니다저는 그가 말한 대로 하고, 저는 다음을 얻습니다.

dt.Errors()[0] {System을 가져옵니다.Data.DataRow} HasErrors: trueItemArray: {object[10]} 행 오류: "'eval' 열은 DBNull을 허용하지 않습니다.가치."

그래서 저는 제 문제를 교체함으로써 해결합니다.e.eval 그리고.NVL (e.eval,'') eval그리고 이것이 제 문제를 해결합니다.정말 감사해요.

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

  • AllowDB로 설정되지 않은 열에 대해 반환되는 null 값Null
  • 중복 행이 동일한 기본 키로 반환됩니다.
  • 데이터베이스와 데이터 집합 사이의 열 정의(예: char 필드 크기) 불일치

결과 집합이 너무 크지 않으면 쿼리를 기본적으로 실행하고 결과를 확인합니다.null 값을 제거한 경우 기본 키 열이 중복되고 있을 것입니다.

또는 이렇게 생성된 코드에 Try/Catch 블록을 수동으로 추가한 다음 예외가 발생하면 중단할 수 있습니다.

여기에 이미지 설명 입력

명령에서 그런다음명창다호다니출합음을에서령다▁then를 호출합니다.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은 불일치를 좋아하지 않는 것 같습니다.이 문제는 일반적으로 테이블에 새 필드를 추가한 후에 발생합니다.

  • 데이터베이스에서 막대 필드의 길이를 변경했지만 XSS 파일에 포함된 XML이 해당 필드를 선택하지 않은 경우 XML에서 필드 이름과 속성 정의를 찾아 수동으로 변경합니다.

  • 반환되는 데이터와 관련이 없는 경우 테이블 어댑터의 선택 목록에서 기본 키를 제거합니다.

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

  • SQL 유니언은 문제를 일으킬 수 있습니다.다른 테이블 어댑터보다 먼저 '직원을 선택하십시오' 레코드를 추가하여 테이블 어댑터 하나를 수정했습니다.다른 필드의 경우, 예를 들어 길이가 1인 문자열을 포함한 더미 데이터를 제공했습니다.DAL은 초기 기록에서 스키마를 추론했습니다.길이가 12인 문자열로 이어지는 레코드가 실패했습니다.

이것은 나에게 효과가 있었다, 출처: 여기.

저는 이 오류가 있었고 DB 제약 조건과 관련이 없었습니다(적어도 저의 경우).레코드 그룹을 반환하는 GetRecord 쿼리가 있는 .xsd 파일이 있습니다.그 표의 열 중 하나는 "nvarchar(512)"였고 프로젝트 중간에 "nvarchar(MAX)"로 변경해야 했습니다.

사용자가 해당 필드에 512개 이상을 입력하고 유명한 오류 메시지가 표시되기 전까지는 모든 것이 정상적으로 작동했습니다. "제한을 활성화하지 못했습니다.하나 이상의 행에 null이 아니거나 고유하거나 외래 키 제약 조건을 위반하는 값이 있습니다."

솔루션:데이터 테이블에 있는 열의 MaxLength 속성을 모두 확인합니다.

"nvarchar(512)"에서 "nvarchar(MAX)"로 변경한 열에 MaxLength 속성의 512 값이 남아 있어 "-1"로 변경하면 작동합니다!!

데이터 액세스 디자이너에 문제가 있습니다.Visual Studio에서 "Server Explorer"에서 디자이너 창으로 보기를 풀 때 실제로 null로 설정되어 있지만 열에 기본 키를 임의로 추가하거나 NULL이 아닌 항목으로 표시합니다.SQL DB 서버에서 실제 View를 생성한 경우 기본 키가 정의되지 않았거나 NULL이 정의되지 않은 경우에도 VS 설계자가 이 키/제약 조건을 추가하고 있습니다.

설계자에서 이를 확인할 수 있습니다. 열 이름 왼쪽에 키 아이콘이 표시됩니다.

솔루션:키 아이콘을 마우스 오른쪽 버튼으로 클릭하고 '키 삭제'를 선택합니다.이것으로 문제가 해결될 것입니다.열을 마우스 오른쪽 버튼으로 클릭하고 "속성"을 선택하여 VS 데이터 액세스 디자이너에서 열의 속성 목록을 보고 값을 적절하게 변경할 수도 있습니다.

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

저 같은 경우에는 프로젝트 설계 시간(데이터 액세스 계층)에 배치한 .xsd 개체도 가지고 있습니다.데이터베이스 테이블 개체를 Dataset 시각적 항목으로 끌면 기본 데이터베이스에서 각 테이블 정의를 읽고 데이터베이스에 테이블을 만들 때 정의한 대로 제약 조건을 Dataset 개체에 복사합니다(SQL Server 2008 R2의 경우).즉, "not null" 또는 "foreign key" 제약 조건으로 작성된 모든 테이블 열이 SQL 문 또는 저장 프로시저의 결과에도 존재해야 합니다.

모든 키 열과 "not null"로 정의된 열을 쿼리에 포함한 후 문제가 완전히 사라졌습니다.

내 것은 내가 설정했을 때 작동하기 시작했습니다.AllowDBNull로 설정합니다.xsd 파일에는 True가 있습니다.

다음과 같이 하나 이상의 열을 선택하는 것처럼 들립니다.

   e.eval, e.batch_no, e.crsnum, e.lect_code, e.prof_course

에는 데이터 집합 정의에서 AllowDBNull이 False로 설정되어 있습니다.

SELECT 문을 실행하는 데 제약 조건을 활성화해야 하는 이유는 명확하지 않습니다.저는 C#이나 관련 기술은 모르지만 Informix 데이터베이스는 알고 있습니다.쿼리 코드가 제약 조건을 활성화(및 비활성화)하는 경우 시스템에 이상한 문제가 있습니다.

또한 구식의 비표준 Informix OUTER 조인 표기법을 피해야 합니다.불가능할 정도로 오래된 버전의 Informix를 사용하지 않는 한, SQL-92 스타일의 조인을 사용해야 합니다.

질문에 두 개의 외부 조인이 언급된 것처럼 보이지만 예제 쿼리에는 하나만 표시됩니다.그것 또한, 약간 혼란스럽습니다.

이▁''▁''' 의 결합 조건e나머지 표는 다음과 같습니다.

AND c.crsnum = e.crsnum  
AND c.batch_no = e.batch_no  
AND d.lect_code= e.lect_code 

이것은 특이한 조합입니다.관련 참조 무결성 제약 조건이 있는 스키마의 관련 하위 집합이 없기 때문에 이것이 맞는지 여부를 알 수 없지만, 이렇게 세 개의 테이블 사이에 결합하는 것은 조금 이례적입니다.

이 중 어느 것도 당신의 문제에 대한 결정적인 답은 아닙니다. 하지만 그것은 약간의 지침을 제공할 수 있습니다.

지금까지 보내주신 모든 의견에 감사드립니다.DB를 정상화하거나 애플리케이션의 스키마 변경 사항(예: 데이터 세트)을 업데이트했을 수도 있지만, 다른 원인도 있습니다. (쿼리에서 테이블을 결합할 때) sql CARTENSIC 제품입니다.

데카르트 쿼리 결과가 있으면 둘 이상의 테이블의 기본(또는 키 우선) 테이블에 중복된 레코드가 결합됩니다.SQL에서 "Where" 절을 지정하더라도, 예를 들어 보조 테이블이 있는 JOIN에 부등 조인이 포함된 경우 데카르트가 계속 발생할 수 있습니다(2개 이상의 비관련 테이블에서 데이터를 가져올 때 유용).

FROM tbFirstINE JOIN tbFirst.reference_str <> tbSystem.systemKey_str

이에 대한 해결책: 테이블은 관련되어야 합니다.

고마워요, 채그버트

저는 이것을 거짓에서 진실로 바꾸는 것으로 같은 문제를 해결했습니다.결국 데이터베이스로 들어가 비트 필드를 null로 변경한 다음 xsd를 새로 고치고 wsd와 reference.cs 을 새로 고쳤으며 이제 모든 것이 정상입니다.

this.columnAttachPDFToEmailFlag.AllowDBNull = true;

간단하고 쉬운 해결책:

MSSQL Studio Sever로 이동합니다.

이 오류의 원인에 대한 쿼리를 실행합니다. 제 경우 ID 사양 증분을 1로 설정하는 것을 잊었기 때문에 ID 값이 null인 것을 알 수 있습니다.

여기에 이미지 설명 입력

id 필드가 자동 인크리먼트이므로 1을 입력하고 design view에서 NULLs를 허용하지 않음을 수정합니다.

여기에 이미지 설명 입력

바인딩 소스 및 테이블 어댑터가 다음 코드에서 오류를 발생시킨 오류입니다.

   this.exchangeCheckoutReportTableAdapter.Fill(this.sbmsDataSet.ExchangeCheckouReportTable);

다이렉트캐스트(dt).행(0), 데이터 행).행 오류

이는 직접적으로 오류를 발생시킵니다.

Visual Studio Dataset Designer를 사용하여 데이터 테이블을 가져오는 경우 '제약 조건을 활성화하지 못함' 오류가 발생합니다.저도 같은 문제에 직면한 적이 있습니다. 데이터 세트 디자이너 자체의 데이터를 미리 보고 데이터베이스 내의 테이블과 일치시키려고 합니다.

이 문제를 해결하는 가장 좋은 방법은 테이블 어댑터를 삭제하고 대신 새 어댑터를 만드는 것입니다.

보조 방법: *


[ID]가 기본 키로 필요하지 않은 경우

기본 키 특성을 제거합니다.

DataSet > TableAdapter > [id] 열을 오른쪽 클릭하여 Delete key ...를 선택합니다.

문제가 해결될 것입니다.

저도 이 문제가 있었는데 기본 SQL 서버에서 변경된 컬럼의 수정된 크기를 반영하여 *.xsd를 수정한 후 해결되었습니다.

이 오류를 해결하기 위해 Dataset 디자이너에서 문제가 있는 테이블 어댑터를 제거하고 데이터 세트를 저장한 다음 서버 탐색기에서 테이블 어댑터의 새 복사본을 가져와 수정했습니다.

XML 판독기로 .xsd 파일을 열고 보기 중 하나에 배치된 제약 조건을 삭제하여 이 문제를 해결했습니다.어떤 이유로든 데이터에 보기를 추가하면 열 중 하나에 기본 키 제약 조건이 추가되지 않아야 하는 경우에 기본 키 제약 조건이 추가되었습니다.

다른 방법은 .xsd 파일을 정상적으로 열고 문제의 원인이 되는 테이블/뷰를 보고 키를 삭제하는 것입니다(오른쪽 클릭 열, 선택).delete key는 안 됩니다 있어서는 안 되는 것입니다.

위에 나열된 예외에 대한 또 다른 가능한 이유를 추가합니다(특히 데이터 세트 스키마를 수동으로 정의하려는 사용자의 경우).

두때 (데이터세두트개테있있관경는우계가고이블이에의경▁when(우있데hip▁(는▁relations▁in▁and▁is▁a가▁your▁you▁there계관▁have▁tables▁dataset)DataSet.Reletions.Add()첫됩니다.chfield두테이블의 로 합니다.pfield), 필드가 고유하거나 기본 키로 명시적으로 지정되지 않더라도 고유하도록 해당 필드에 암시적 제약 조건이 추가되는 것과 같습니다.

부모 인 값을 행이 .pfield 이 예외도 발생합니다.

저의 경우 이 오류는 문자열 열 크기에 의해 발생했습니다.이상한 것은 다른 도구에서 동일한 쿼리를 실행했을 때 반복되는 값이나 null 값이 없었다는 것입니다.

그리고 나서 저는 문자열 기둥의 크기가 50이라는 것을 발견했습니다. 그래서 제가 채우기 방법을 호출했을 때, 이 예외를 던졌습니다.
열을 클릭하고 속성에서 크기를 200으로 설정하면 오류가 사라집니다.

이것이 도움이 되길 바랍니다.

다음과 같이 "하위 선택"을 수행하여 이 문제를 해결했습니다.

string newQuery = "select * from (" + query + ") as temp";

mysql에서 이 작업을 수행하면 모든 컬럼 속성(null이 아닌 고유한...)이 지워집니다.

            using (var tbl = new DataTable())
            using (var rdr = cmd.ExecuteReader())
            {
                tbl.BeginLoadData();

                try
                {
                    tbl.Load(rdr);
                }
                catch (ConstraintException ex)
                {
                    rdr.Close();
                    tbl.Clear();

                    // clear constraints, source of exceptions
                    // note: column schema already loaded!
                    tbl.Constraints.Clear();
                    tbl.Load(cmd.ExecuteReader());
                }
                finally
                {
                    tbl.EndLoadData();
                }
            }

동일한 오류 유형을 받았는데, 제 경우 선택한 필드를 제거하고 *.로 대체하여 해결했습니다. 왜 그런 일이 발생했는지 모르겠습니다.그 질문에는 오타나 화려한 것이 없었습니다.

최선의 해결책은 아니었지만 다른 방법은 효과가 없었고 저는 지쳐가고 있었습니다.

명확한 답을 찾는 과정에서 다음과 같은 것을 발견했습니다. https://www.codeproject.com/questions/45516/failed-to-enable-constraints-one-or-more-rows-cont

솔루션 8

이 오류는 Visual Studio 2010을 사용하는 프로젝트에서도 나타납니다.블로그에 , 키 정의, 조건 .EnforceConstraints데이터 집합 변수입니다.

저의 경우 프로젝트 설계 시간에 (데이터 액세스 계층에) 배치한 .xsd 개체가 있습니다.에서 각 을 스베이테개이블데체이를터시다항끌니각복서합사조로 합니다.Dataset데이터베이스에 테이블을 만들 때 정의한 대로 개체를 만듭니다(SQL Server 2008 R2의 경우)., " null"key"의된 모든 문 프로시저의 . "not null", "not null" "foreign key" 및 "foreign key"는 SQL에서 생성된 모든 테이블 열입니다.

모든 제약된 열(null, 기본 키, 외부 키 등이 아님)을 쿼리에 포함한 후 문제가 완전히 사라졌습니다.

쿼리/저장 프로시저 결과에 모든 테이블 열이 있어야 하는 것은 아니지만, 제약 조건이 여전히 적용되기 때문에 일부 제약 조건 열이 결과에 나타나지 않으면 오류가 표시됩니다.

이것이 다른 사람에게 도움이 되기를 바랍니다.

DataTable이 아닌 DataSet에 문제가 있는 경우:

if (dataSet.HasErrors)
    foreach (DataTable table in dataSet.Tables)
        if (table.HasErrors)
            foreach (var row in table.GetErrors())
                Debug.Write($"Error in DataTable {table.TableName}: {row.RowError}")

_sample_DataSet이 채우는 동안 오류가 발생하는 데이터 집합의 이름인 경우, TryCatch 안에 채우기 데이터 집합을 넣은 다음 catch{} 블록에 다음 코드를 넣으면 정확하게 잘못된 열을 찾을 수 있습니다.

            foreach (DataTable _dtable in _sample_DataSet.DataSet.Tables)
            {
                foreach (DataRow dr in _dtable.Rows)
                {
                if (dr.HasErrors)
                {
                        if (dr.HasErrors)
                        {
                            Debug.Write("Row error="+dr.RowError);

                        }
                }
            }

문제는 UNIQUE 절 IMHO에 있습니다.SQL 쿼리가 SQL에서 100% 실행되지만 코드에서는 작동하지 않는 이 팝업과 같은 문제가 있었습니다.

고유 또는 고유 절이 문제입니다.

언급URL : https://stackoverflow.com/questions/7026566/failed-to-enable-constraints-one-or-more-rows-contain-values-violating-non-null