启用约束失败。使用数据表适配器时。

8

我遇到了以下问题:

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

这是在我的表适配器中执行以下查询时出现的错误。

select 
f.id, f.name, p.productid, p.masterproductID, f.productid, f.dateCreated, f.retired, p.code as HTML_DisplayName, p.ThumbnailID, p.code
from FormSaveData f 

inner join Products p on (f.productid = p.ProductID or f.productId = p.MasterProductID)

where f.userId = 130559
and (p.b_IsArchived = 0 and p.b_IsRetired=0 and p.b_IsStaged = 0)

当我单独运行查询时,它能正常工作,其他用户ID也能正常工作,所以这是一个非常特殊的情况。我已经缩小了范围,发现我正在使用内联连接。 f.productid = p.ProductID **或者** f.productId = p.MasterProductID 我相信在某些罕见情况下,这会导致某种冲突,而表适配器不喜欢这种情况。当涉及到表适配器和SQL时,我几乎是个新手,所以任何有关如何更好地编写代码或为什么会出现这种情况的建议都将不胜感激。
FormSaveData表中没有设置任何约束、键或特殊规则。

如果您只使用'f.productid = p.ProductID'或'f.productid = p.MasterProductID'中的一个,会发生什么? - tofutim
通常情况下,我会期望 DataTable 中填充来自单个表的行,而不是联接查询。您仍然可以通过外键关系从 FormSaveData 转到 Products,反之亦然。无论如何,如果您需要这个查询用于表适配器,您应该检查将由此适配器填充的 DataTable 的定义,以查看必须不为空的列以及数据集中的唯一和外键约束,以及此查询结果可能会破坏其中之一的数据。 - JayK
@tofutim 如果我只使用其中一个,它可以工作。问题在于有些行具有productID,有些行具有master,并且需要同时检查两者。 - Maxx
2个回答

12

我看你的查询结果返回了多条product_id相同的记录,而表适配器只期望唯一的行。我很确定你可以通过将EnforceConstraints设置为false来禁用此行为。


这是在表适配器属性中的一个设置吗?我真的很希望得到这样的答案。这样可以减少回归测试。 - Maxx
我将EnforceConstraints设置为false,但现在出现了“对象引用未设置为对象实例”的错误 :( - Maxx
2
我重新制作了我的表适配器,现在它可以正常工作了。感谢您的帮助。 - Maxx

4

如果您不需要[id]作为主键,

请删除其主键属性:

在您的DataSet > TableAdapter > 右键单击[id]列 > 选择删除键...

问题将得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接