是什么导致在加载DataSet时触发ConstraintException?

时间:2020-03-06 14:47:27  来源:igfitidea点击:

如何找出违反约束的列和值?异常消息根本没有帮助:

Failed to enable constraints. One or
  more rows contain values violating
  non-null, unique, or foreign-key
  constraints.

解决方案

我们可以检查一个名为RowError的属性。

参见http://dotnetdebug.ne​​t/2006/07/16/constraintexception-a-helpful-tip/

编辑添加了此链接,该链接显示了行的迭代,以查看有错误的行。

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

像许多人一样,我有自己的标准数据访问组件,其中包括返回DataSet的方法。当然,如果引发ConstraintException,则不会将DataSet返回给调用方,因此调用方无法检查行错误。

我所做的是在此类方法中捕获并重新抛出ConstraintException,记录行错误详细信息,如以下示例所示(使用Log4Net进行记录):

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

我添加了一些代码,这些代码在调试ConstraintException出现时很有用

希望这可以帮助。

当我们使用强类型数据集并使用可视设计器(xsd):访问tbl.Rows [0] .RowError信息时,我们需要创建Fill方法。

我们不能使用Get方法,因为DataTable是在生成的代码中实例化的。