C# 在DataTable中加载DataReader时获取约束异常

C# 在DataTable中加载DataReader时获取约束异常,c#,sql-server-2008,datatable,dbdatareader,C#,Sql Server 2008,Datatable,Dbdatareader,我对SQL2008数据库运行了一个合并查询,该数据库使用以下c代码返回合并的输出: cmd.CommandText = query; if (conn.DBConn.State == ConnectionState.Closed) conn.DBConn.Open(); DbDataReader dbReader = cmd.ExecuteReader(); DataTable dt = new DataTable("Results"); dt.Load(dbReader); 最后一行抛出一个

我对SQL2008数据库运行了一个合并查询,该数据库使用以下c代码返回合并的输出:

cmd.CommandText = query;
if (conn.DBConn.State == ConnectionState.Closed) conn.DBConn.Open();
DbDataReader dbReader = cmd.ExecuteReader();
DataTable dt = new DataTable("Results");
dt.Load(dbReader);
最后一行抛出一个错误:

System.Data.ConstraintException-未能启用约束。一个或多个 更多行包含违反非空、唯一或外键的值 限制

我在MSDN上找到了它,它符合我的场景,但我该如何解决这个问题呢

使用dt.PrimaryKey=null清除主键;不起作用


上面的代码将用于许多表。

您的查询是否返回多个结果集?在Management Studio或类似工具中运行查询以查看。

违反非空、唯一或外键约束

non-null:检查是否有一些字段返回null,以及该字段是否允许null

独特:似乎已得到确认

执行此操作。将select输出作为派生表,然后从派生表中选择*

这似乎有帮助

将dt.BeginLoadData放在调用Load之前

 dt.BeginLoadData();
 dt.Load(dbReader);
 dt.EndLoadData();

对于这个错误,我发现的最简单的解决方法是只将它包装在一个Catch块中并忽略错误。我是在执行cjb110关于挖掘更多约束错误信息的过程中发现的。令我惊讶的是,我完全意外地了解到,我们可以完全忽略错误,按原样使用数据表。我已经验证了下面的VB代码可以通过C语法的代码转换器自由地运行它,它会按预期返回所有的行和列,至少在我遇到的主要是ADOMD命令对象的问题的实例中是这样

 Try

 TempDataTable.Load(PrimaryCommand.ExecuteReader)

Catch ex As ConstraintException

  End Try

请注意,此问题可能与较新线程重复

我可以确认返回的是单个表。返回的表不基于强类型数据集。它是由SQL引擎根据我合并的表生成的具有不同列的表。没有为返回的表定义键!有趣的是合并已经成功完成,因此只有合并的输出才会引起问题。我希望这对我来说能起作用,因为它在加载数据时关闭了通知、索引维护和约束。但是没有任何效果。@SQLServerSteve这样做成功了吗?你也有同样的问题,而其他答案也没有帮助?@dpopov-请看上面我的答案,我只是抓住了错误并忽略了它,这就成功了。我只是在你的答案上留下这条评论,让你知道你的方法在我的案例中不起作用,出于某种原因,我先尝试了你的方法。
 Try

 TempDataTable.Load(PrimaryCommand.ExecuteReader)

Catch ex As ConstraintException

  End Try