The DELETE statement conflicted with the REFERENCE constraint


作者: | 2008/07/12 | 留言


這是在練習VB.net更新DataSet時遇到的第一個錯誤訊息。

練習更新DataSet時,做出了一個如下圖這樣的表單(一個label, 一個comboBox, 一個button, 兩個DataGridView):


以NORTHWIND範例資料庫為例,新增Products, Suppliers, Order Details資料表作為資料來源(如右圖)。

Products資料表階層下之所以還有個Order Details的資料表,主要是因為兩者之間有關聯(以ProductsID作關聯),Products為父資料表,Order Details為子資料表。同樣的,Suppliers與Products之間也有如此關聯(以SupplierID作關聯)。三個資料表之間的關聯如下圖。

這個簡單的例子要讓User能直接對DataGridView進行新增、刪除、修改後,在表單上提供一個”更新”按鈕讓User完成修改後可以將記錄寫回至資料庫。在放好Label, comboBox (DataSource屬性設為Suppliers資料表, DislayMember為Company Name,ValueMember為SupplierID)後,接著直接將資料來源視窗內的Suppliers資料表階層下的Products資料表拉進表單,成為表單中間的DataGridView;同樣的,Products下面的Order Details拉進,為下面的DataGridView。

更新按鈕的Click事件函數如下(為求簡單,先不考慮異常例外的處理):
[csharp]
Private Sub BtnUpdate_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles BtnUpdate.Click
Dim dsChanged As DataSet
dsChanged = NORTHWNDDataSet.GetChanges(DataRowState.Added +_
DataRowState.Deleted +_
DataRowState.Modified)
ProductsTableAdapter.Update(dsChanged)
End Sub
[/csharp]
執行的畫面如下:

此時刪除Products記錄,可能會出現如下錯誤訊息:

這樣看來是容易理解的,因為NORTHWIND在Products與Order Details資料表存在Foreign Key(外來鍵),若刪除某個Product,該ID必須沒有與其他資料表有關聯,否則此關聯就被破壞了。例如,若把ID為38的產品刪除了,那所有訂單中有訂購ID為38的產品都將關聯不到ID為38的產品。解決方法可能就必須先刪除Order Details所有有訂購ID為38的產品之記錄,不過完整正確的作法當然要提示User,也要對有訂38的訂單記錄作適當的處理。


標籤:

分類:

本文作者是Audi Lu

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

*

*

*

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料