【问题标题】:What triggers ConstraintException when loading DataSet?加载 DataSet 时什么触发了 ConstraintException?
【发布时间】:2010-09-13 12:00:29
【问题描述】:

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

未能启用约束。一个或 更多行包含违反的值 非空、唯一或外键 约束。

【问题讨论】:

  • 如果可以的话,我会给你更多的赞成票。这也是我的一根刺。

标签: c# .net dataset


【解决方案1】:

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

【讨论】:

  • 您的 LogErrors 方法很棒!今天真的救了我。
【解决方案2】:

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

见http://dotnetdebug.net/2006/07/16/constraintexception-a-helpful-tip/

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 就像你说的,你需要一个填充。很奇怪;当我只获取一些数据(基本选择)时,为什么我需要一个填充语句。内部某处认为这种 Fill 方法似乎被 .net 使用。在我生成了一个 Fill 方法(get 没有变化)之后它就起作用了。
    【解决方案4】:

    对于希望通过 sn-p 获取有关 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);
    }
    

    【讨论】:

      【解决方案5】:

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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-18
        • 2017-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多