【问题标题】:Failed to enable constraints. When using a data table adapter无法启用约束。使用数据表适配器时
【发布时间】: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


【解决方案1】:

在我看来,您的查询返回了多个具有相同 product_id 的记录,并且表适配器只需要唯一的行。我很确定您可以通过将EnforceConstraints 设置为false 来禁用该行为。

【讨论】:

  • 这是表适配器属性中的设置吗?我真的很希望得到这样的答案。减少回归测试。
  • 我将 EnforceConstraints 设置为 false,但现在我得到一个未设置为对象实例的对象引用错误:(
  • 我重做表适配器后,它工作正常。感谢您的帮助。
【解决方案2】:

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

移除其主键属性:

在您的 DataSet > TableAdapter > 右键单击​​ [id] 列 > 选择 Delete key ...

问题将得到解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2013-03-18
    相关资源
    最近更新 更多