Pregunta

¿Cómo puedo averiguar qué columna y valor está violando la restricción? El mensaje de excepción no es útil en absoluto:

  

Error al habilitar restricciones. Uno o   más filas contienen valores que violan   clave no nula, única o foránea   restricciones.

¿Fue útil?

Solución

Hay una propiedad llamada RowError que puede verificar.

Ver http://dotnetdebug.net/2006/07/ 16 / restrictintexception-a-Helpful-tip /

Editado para agregar este enlace que muestra la iteración de las filas para ver cuáles tuvieron errores.

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

Otros consejos

Como muchas personas, tengo mis propios componentes estándar de acceso a datos, que incluyen métodos para devolver un DataSet. Por supuesto, si se lanza una ConstraintException, el DataSet no se devuelve a la persona que llama, por lo que la persona que llama no puede verificar si hay errores de fila.

Lo que he hecho es capturar y volver a generar ConstraintException en dichos métodos, registrando detalles de error de fila, como en el siguiente ejemplo (que usa Log4Net para iniciar sesión):

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

Cuando utiliza un conjunto de datos con tipo seguro y utiliza el diseñador visual (xsd): para acceder a la información de tbl.Rows [0] .RowError , debe crear el relleno método.

Usted no puede usar el método Get , ya que DataTable se crea dentro del código generado.

Agregué un código que he encontrado útil para depurar ocurrencias de Restricciones de excepción aquí

Espero que esto ayude.

Para los googlers que desean 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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top