Frage

Wie kann ich herausfinden, welche Spalte und Wert die Einschränkung verletzt? Die Ausnahmemeldung nicht hilfreich ist überhaupt:

  

Fehler beim Aktivieren. Eins oder   mehr Zeilen enthalten Werte verletzen   Nicht-null, einzigartig, oder Fremdschlüssel   Einschränkungen.

War es hilfreich?

Lösung

Es gibt eine Eigenschaft namens RowError Sie überprüfen können.

Siehe http://dotnetdebug.net/2006/07/ 16 / ConstraintException-a-nützlich-tip /

Edited diesen Link zeigt Iteration von Zeilen hinzufügen, um zu sehen, welche Fehler hatte.

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

Andere Tipps

Wie viele Menschen, ich meine eigenen Standard-Datenzugriffskomponenten habe, die Verfahren umfassen einen Datensatz zurückzukehren. Natürlich, wenn eine ConstraintException geworfen wird, wird der Datensatz nicht an den Aufrufer zurückgegeben, so überprüfen kann der Anrufer nicht für Zeilenfehler.

Was ich habe, ist, getan zu fangen und rethrow ConstraintException in solchen Verfahren Reihe Fehlerdetails Anmeldung, wie im folgenden Beispiel (die Log4Net für die Protokollierung verwendet):

...
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());
}

Wenn Sie eine starke typisierte Datasets verwenden und verwendet, um den visuellen Designer (XSD): den Zugriff auf tbl.Rows [0] .RowError Informationen, müssen Sie die erstellen, geben Sie bitte Methode.

Sie kann die Route nicht verwenden Methode, da die Datentabelle innerhalb generierten Code instanziert wird.

Ich habe einige Code, den ich gefunden habe hier in Debuggen ConstraintException Vorkommen nützlich sein

Hope, das hilft.

Für Googler, die einen Ausschnitt möchten mehr Details über die ConstraintException zu bekommen:

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top