加载数据集时触发约束异常的内容
本文关键字:异常 约束 数据集 加载 | 更新日期: 2023-09-27 17:47:21
如何找出哪个列和值违反了约束?异常消息根本没有帮助:
无法启用约束。一个或 更多行包含违反的值 非空、唯一或外键 约束。
像许多人一样,我有自己的标准数据访问组件,其中包括返回数据集的方法。 当然,如果抛出 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());
}
您可以检查一个名为 RowError 的属性。
见 http://dotnetdebug.net/2006/07/16/constraintexception-a-helpful-tip/
已编辑以添加此链接,显示行的迭代以查看哪些有错误。
http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic58812.aspx
使用强类型化数据集并使用可视化设计器 (xsd) 访问 tbl 时。行[0]。行错误信息,您需要创建 Fill 方法。
不能使用 Get 方法,因为数据表是在生成的代码中实例化的。
对于想要一个片段来获取有关 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);
}
我添加了一些代码,我发现这些代码在调试此处的约束异常事件时很有用
希望这有帮助。