填充子数据表时出错(约束错误)(如果父数据中不存在)

雷耶斯

会员
已加入
2016年11月11日
留言内容
20
编程经验
1-3
大家好

这是我的问题:

我有一个显示所有客户信息的Windows窗体。它通过在加载表单时填充所有表来做到这一点,并且可以正常工作。

我还有一个“搜索”功能,可以按条件选择客户(例如“ StatusID”)。在这两种情况下,都会填充客户表(父表)。但是,由于客户表只能包含该表的一部分(因为它已被其SQL查询中的“ where”子句过滤),因此当我填充其“客户ID”的FK不在以下结果中的子表时我的数据集,我得到了错误:

"无法启用约束。一或多个行包含违反非null,唯一或外键约束的值。".

我知道为什么得到这个,但是我的问题是如何避免呢?我是否只是将'EnforceConstraints'设置为false以避免错误,然后又返回true,或者是否可以将所有人的客户表填满然后应用过滤条件(LINQ?),或者可以对我进行修改子表查询(尽管我认为这不会解决任何问题,因为查询将检查数据库,而不是我的数据集!)。

有想法吗?

谢谢。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
您基本上有两种选择:

1.获取所有父数据和所有子数据,并在本地进行过滤。这可能意味着将父DataTable绑定到BindingSource并设置BindingSource的Filter属性。这样,您将所有父记录都保存在DataSet中,但是您只能在UI中看到其中的一些记录。

2.获取子数据(可能还有父数据)时,请调用GetData方法而不是Fill方法。如果调用Fill方法以填充数据集中的数据表,那么您将受到该数据集的约束。如果调用GetData方法,则会获得新的独立DataTable,因此不受DataSet约束。

如果您已经在没有父母的情况下检索了孩子数据,那么我必须认为您实际上并没有使用该关系,因此我认为使用选项2不会有问题。但是,由于DataTable是在运行时创建的,因此无法在设计器中进行绑定。
 

雷耶斯

会员
已加入
2016年11月11日
留言内容
20
编程经验
1-3
谢谢jmcilhinney。

使用BindingSource筛选器的解决方案就像一个gem,这正是我在寻找的东西。在我的情况下,这也比写存储过程或其他查询来满足如此小的过滤需求要好得多。

可爱的指针,再次感谢。
 
最佳 底部