【发布时间】:2011-12-08 02:44:32
【问题描述】:
我来了
未能启用约束。一行或多行包含值 违反非空、唯一或外键约束。
用于我的表适配器中的以下查询。
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 **or** f.productId = p.MasterProductID
我相信在某些极少数情况下,这会导致表适配器不喜欢的某种冲突。在表适配器和 SQL 方面,我几乎是个新手,所以任何关于如何更好地编写或为什么会发生这种情况的建议将不胜感激。
没有为 FormSaveData 表中的任何内容设置任何约束、键或特殊规则。
【问题讨论】:
-
如果您只使用 'f.productid = p.ProductID' 或只使用 'f.productid = p.MasterProductID' 会发生什么?
-
通常我希望 DataTable 填充单个表中的行,而不是连接查询。然后,您仍然可以通过外键关系从 FormSaveData 转到 Products ,反之亦然。无论如何,如果您需要对表适配器进行此查询,则应检查将由该适配器填充的 DataTable 的定义,以查找不能为 NULL 的列以及 DataSet 中的唯一和外键约束,以及数据是否此查询的结果可能会破坏其中一个。
-
@tofutim 如果我只使用其中一个,它就可以工作。问题是有些行有productID,有些有master,它需要检查两者。
标签: c# .net sql tableadapter