我在Windows Form應用程序上使用VS2008 C#Express和Northwind數據庫。如何基於兩個表篩選TableAdapter的FillBy?
我使用拖放來設置兩個datagridviews的主詳細信息綁定(我使用了訂單和訂單詳細信息)。在這一點上,一切都按預期工作。因此,爲了不返回表中的每一行,我想根據Orders表的過濾器以及Orders Details表中的字段過濾Orders表。在TableAdapter配置嚮導中,我使用查詢構建器添加了一個新的FillByMyFilter,它創建了以下查詢:
SELECT Orders。[Order ID],Orders。[Customer ID],Orders。[Employee ID],Orders。 [船名],[訂單] [訂單] [訂單] [訂單] [訂單] [訂單] [訂單] [訂單] [訂單] [訂單] [訂單] [訂單日期],訂單[需要日期],訂單。[發貨日期], 訂單。貨運 從訂單內部聯接 [訂單詳細信息]開啓訂單[訂單ID] = [訂單詳細信息]。 ] WHERE(訂單。[船名] LIKE N'A%')和([訂單明細]。數量< 20)
我通過添加這兩個表得到了這一點,但沒有檢查Order Details表中的任何字段框,以便它只返回在原始Fill查詢中使用的列。我只是在此時試圖過濾主表中的DataSet,而不返回不同數量的列。訂單明細的子行仍然應該像默認的未經過濾的結果集一樣工作。
現在的問題:當我點擊執行查詢按鈕,它工作正常。我從上面的查詢中得到53行,而不是使用設計者創建的默認填充1078。它返回與原始填充查詢相同的列。但是,當我嘗試運行該應用程序時,出現以下約束錯誤:
「無法啓用約束,一行或多行包含違反非空,唯一或外鍵約束的值。
我在做什麼錯?
更新:我想我得到了約束錯誤,因爲嚮導創建的INNER JOIN。如果我編輯查詢以使用LEFT JOIN,則嚮導會將其更改回INNER JOIN。
我的問題仍然是如何根據Parent和Child表中的條件過濾父表(Orders)中的記錄。我的下一個測試是嘗試使用存儲過程,但想知道只使用TableAdapter自定義FillBy方法。
問候,
調試
謝謝交鑰匙!您提供的鏈接非常豐富。我認爲這個問題與TableAdapter嚮導使用INNER JOIN的方式有關(即使我將它更改爲嚮導將它放回)。這將帶回重複的行並破壞主鍵約束。我會嘗試下一個存儲過程。 – user45191 2009-01-04 18:19:16
鏈接已移至 - > http://osherove.com/blog/2004/10/3/dataset-hell-failed-to-enable-constraints-one-or-more-rows-c.html – 2012-06-01 19:07:26
謝謝John ,我更新了新鏈接。 – Turnkey 2012-06-01 19:12:53