Co wyzwala ConstraintException podczas ładowania zestawu danych?

Jak mogę dowiedzieć się, która kolumna i wartość naruszają ograniczenie? Komunikat o wyjątku w ogóle nie jest pomocny:

Nie udało się włączyć ograniczeń. Jeden lub więcej wierszy zawiera wartości naruszające non-null, unique, or foreign-key ograniczenia.

Author: Dala, 2008-09-26

5 answers

Istnieje właściwość o nazwie RowError, którą możesz sprawdzić.

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

Edited to add this link showing iteration of rows to see which had errors.

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

 11
Author: Nikki9696,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 15:27:01

Podobnie jak wiele osób, mam własne standardowe komponenty dostępu do danych, które zawierają metody zwracania zbioru danych. Oczywiście, jeśli zostanie rzucone ConstraintException, zestaw danych nie zostanie zwrócony do wywołującego, więc wywołujący nie może sprawdzić błędów wiersza.

To co zrobiłem to catch i rethrow ConstraintException w takich metodach, logging row error details, jak w poniższym przykładzie (który używa Log4Net do logowania):

...
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());
}
 20
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 16:59:42

Gdy korzystasz z silnego zestawu danych i używasz Visual designera (xsd): aby uzyskać dostęp do tbl.Wiersze [0].RowError informacje, należy utworzyć metodę Fill .

Ty nie możesz użyć metody Get , ponieważ DataTable jest instancjonowany w wygenerowanym kodzie.

 3
Author: doekman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-29 13:00:58

Dodałem kod, który okazał się przydatny w debugowaniu wystąpień ConstraintException tutaj

Mam nadzieję, że to pomoże.

 1
Author: Jonathan Webb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:53:31

Dla googlerów, którzy chcą uzyskać więcej informacji na temat ConstraintException:

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);
}
 1
Author: Olivier de Rivoyre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-11 16:07:55