我在 Windows 窗体应用程序上使用 VS2008 C# Express 和 Northwind 数据库。
我使用拖放设置两个数据网格视图的主详细信息绑定(我使用了订单和订单详细信息)。在这一点上,一切都按预期工作。为了不返回表中的每一行,我想根据 Orders 表的过滤器和 Orders Details 表中的字段过滤 Orders 表。在 TableAdapter 配置向导中,我使用查询生成器添加了一个新的 FillByMyFilter,它创建了以下查询:
SELECT Orders.[Order ID]、Orders.[Customer ID]、Orders.[Employee ID]、Orders.[Ship Name]、Orders.[Ship Address]、Orders.[Ship City]、Orders.[Ship Region]、 Orders.[Ship Postal Code]、Orders.[Ship Country]、Orders.[Ship Via]、Orders.[Order Date]、Orders.[Required Date]、Orders.[Shipped Date]、Orders.Freight FROM Orders INNER JOIN [Order Details] ON Orders.[Order ID] = [Order Details].[Order ID] WHERE (Orders.[Ship Name] LIKE N'A%') AND ([Order Details].Quantity < 20)
我通过添加两个表得到了这个,但没有检查 Order Details 表中的任何字段框,因此它只会返回原始 Fill 查询中使用的列。我现在只是试图过滤主表中的数据集,而不是返回不同数量的列。订单详细信息的子行仍应像默认的未过滤结果集一样工作。
现在的问题:当我单击执行查询按钮时,它工作正常。我从上面的查询中得到 53 行,而不是使用设计器创建的默认填充的 1078 行。它返回与原始填充查询相同的列。但是,当我尝试运行应用程序时,出现以下约束错误:
“未能启用约束。一行或多行包含违反非空、唯一或外键约束的值。”
我究竟做错了什么?
更新:我认为由于向导创建的 INNER JOIN 导致约束错误。如果我编辑查询以使用 LEFT JOIN,则向导将其更改回 INNER JOIN。
我的问题仍然是如何根据父表和子表中的条件过滤父表(订单)中的记录。我的下一个测试是尝试使用存储过程,但想知道仅使用 TableAdapter 自定义 FillBy 方法。
问候,
调试