加载DataSet时触发ConstraintException的是什么?

时间:2008-09-26 15:18:13

标签: c# .net dataset

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

  

无法启用约束。一个或   更多行包含违反的值   非null,唯一或外键   约束

5 个答案:

答案 0 :(得分:20)

与许多人一样,我有自己的标准数据访问组件,其中包括返回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());
}

答案 1 :(得分:11)

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

请参阅http://dotnetdebug.net/2006/07/16/constraintexception-a-helpful-tip/

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

我添加了一些我发现在调试ConstraintException出现时很有用的代码here

希望这有帮助。

答案 4 :(得分:1)

对于希望获得有关ConstraintException的更多详细信息的片段的广告客户:

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