c# - net - ¿Qué desencadena la excepción ConstraintException al cargar DataSet?
fill dataset c# (5)
Cuando utiliza un conjunto de datos tipado fuerte y utiliza el diseñador visual (xsd): para acceder a la información tbl.Rows [0] .RowError , debe crear el método de relleno .
No puede usar el método Get , ya que DataTable se instancia en el código generado.
¿Cómo puedo averiguar qué columna y qué valor están violando la restricción? El mensaje de excepción no es útil en absoluto:
Error al habilitar restricciones. Una o más filas contienen valores que violan restricciones no nulas, únicas o de clave foránea.
Para los usuarios de Google que desean obtener un fragmento para obtener más detalles sobre la Excepción de restricción:
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);
}
Agregué un código que encontré útil para depurar las ocurrencias de ConstraintException aquí
Espero que esto ayude.
Al igual que muchas personas, tengo mis propios componentes de acceso a datos estándar, que incluyen métodos para devolver un DataSet. 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 capturar y volver a generar ConstraintException en tales métodos, registrando detalles de error de fila, como en el siguiente ejemplo (que usa 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());
}
Hay una propiedad llamada RowError que puedes verificar.
Ver http://dotnetdebug.net/2006/07/16/constraintexception-a-helpful-tip/
Editado para agregar este enlace que muestra la iteración de las filas para ver cuál tuvo errores.
http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic58812.aspx