igual que muchas personas, tengo mis propios componentes de acceso de datos estándar, que incluyen métodos para devolver un conjunto de datos. Por supuesto, si se lanza una excepción de restricción, el DataSet no se devuelve a la persona que llama, por lo que la persona que llama no puede verificar si hay errores en la fila.
Lo que he hecho es la captura y ConstraintException volver a lanzar en tales métodos, registrando los detalles del error fila, como en el siguiente ejemplo (que utiliza Log4net para el registro):
...
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());
}
Daría más arriba-votos si pudiera. Esta es una espina en mi costado también. –