tables net llenar example ejemplos ejemplo desde c# .net dataset

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