¿Qué desencadena ConstraintException al cargar DataSet?

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

Error al habilitar las restricciones. Una o más filas contienen valores que violan restricciones no nulas, únicas o de clave externa.

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 tenía errores.

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

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 ConstraintException, el DataSet no se devuelve a la persona que llama, por lo que la persona que llama no puede verificar los errores de fila.

Lo que he hecho es capturar y volver a emitir ConstraintException en dichos métodos, registrando los detalles del error de la 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()); } 

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

No puede usar el método Get , ya que DataTable está instanciado dentro del código generado.

He agregado algún código que he encontrado útil para la depuración de las apariciones de ConstraintException aquí

Espero que esto ayude.

Para los usuarios de Google que desean un fragmento de código para obtener más detalles sobre la ConstraintException:

 try { ds.EnforceConstraints = true; } catch (ConstraintException ex) { string details = string.Join("", ds.Tables.Cast() .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); }