The DELETE statement conflicted with the REFERENCE constraint

七月 12, 2008 by mrmu   類別: .Net Framework

分享

這是在練習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事件函數如下(為求簡單,先不考慮異常例外的處理):

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

執行的畫面如下:

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

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

相關文章

臉書迴響

發表迴響