데이터 세트를로드 할 때 제한 조건을 유발하는 것은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/140161

  •  02-07-2019
  •  | 
  •  

문제

어떤 열과 값이 제약 조건을 위반하는지 어떻게 알 수 있습니까? 예외 메시지는 전혀 도움이되지 않습니다.

제약 조건을 활성화하지 못했습니다. 하나 이상의 행에는 비 널, 고유 또는 외국 키 제약 조건을 위반하는 값이 포함되어 있습니다.

도움이 되었습니까?

해결책

당신이 확인할 수있는 Rowerror라는 속성이 있습니다.

보다 http://dotnetdebug.net/2006/07/16/constraintexception-a-helpful-tip/

오류가있는 행의 반복을 보여주는이 링크를 추가하도록 편집했습니다.

http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic58812.aspx

다른 팁

많은 사람들과 마찬가지로, 데이터 세트를 반환하는 메소드가 포함 된 내 자신의 표준 데이터 액세스 구성 요소가 있습니다. 물론 제한 조건증이 발생하면 데이터 세트가 발신자에게 반환되지 않으므로 발신자는 행 오류를 확인할 수 없습니다.

내가 수행 한 것은 다음 예제 (로깅에 log4net을 사용하는)와 같이 이러한 메소드, 로깅 행 오류 세부 사항에서 CATCH 및 RETHROW CONSTRAINTEAXCELCES입니다.

...
try
{
    adapter.Fill(dataTable); // or dataSet
}
catch (ConstraintException)
{
    LogErrors(dataTable);
    throw;
}
...

private static void LogErrors(DataSet dataSet)
{
    foreach (DataTable dataTable in dataSet.Tables)
    {
        LogErrors(dataTable);
    }
}

private static void LogErrors(DataTable dataTable)
{
    if (!dataTable.HasErrors) return;
    StringBuilder sb = new StringBuilder();
    sb.AppendFormat(
        CultureInfo.CurrentCulture,
        "ConstraintException while  filling {0}",
        dataTable.TableName);
    DataRow[] errorRows = dataTable.GetErrors();
    for (int i = 0; (i < MAX_ERRORS_TO_LOG) && (i < errorRows.Length); i++)
    {
        sb.AppendLine();
        sb.Append(errorRows[i].RowError);
    }
    _logger.Error(sb.ToString());
}

강력한 유형 데이터 세트를 사용하고 Visual Designer (XSD)를 사용했을 때 : 액세스 tbl.rows [0] .Rowerror 정보를 만들어야합니다 채우다 방법.

Get을 사용할 수 없습니다 방법, 데이터 가능은 생성 된 코드 내에 인수되므로.

제한 조건증 발생률을 디버깅하는 데 유용한 코드를 추가했습니다. 여기

도움이 되었기를 바랍니다.

스 니펫을 원하는 Googlers의 경우 SufstainTexception에 대한 자세한 내용을 얻을 수 있습니다.

try
{
    ds.EnforceConstraints = true;
}
catch (ConstraintException ex)
{
    string details = string.Join("",
        ds.Tables.Cast<DataTable>()
            .Where(t => t.HasErrors)
            .SelectMany(t => t.GetErrors())
            .Take(50)
            .Select(r => "\n - " + r.Table.TableName + "[" + string.Join(", ", r.Table.PrimaryKey.Select(c => r[c])) + "]: " + r.RowError));
    throw new ConstraintException(ex.Message + details);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top