当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《加载DataSet时触发ConstraintException的是什么?》经验,为你挑选了2个好方法。

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

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

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


Nikki9696.. 11

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

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

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

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



1> Joe..:

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



2> Nikki9696..:

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

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

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

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

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有