Wie viele Leute, ich habe meine eigenen Standard-Datenzugriffskomponenten, die Verfahren umfassen einen Datensatz zurückzukehren. Wenn eine ConstraintException ausgelöst wird, wird das DataSet natürlich nicht an den Aufrufer zurückgegeben, sodass der Aufrufer nicht nach Zeilenfehlern suchen kann.
Was ich getan habe, ist 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());
}
Ich würde Ihnen mehr up-Stimmen, wenn ich könnte. Das ist mir auch ein Dorn im Auge. –