2011-05-04 53 views
1

我有兩個表這樣的類型化的DataSet:類型數據集,級聯刪除的子表記錄

表A(父表)

ID MessageID 
1  1 
2  1 
3  2 
4  3 

表B(子表)

ID MessageID 
1  1 
2  2 
3  3 

我有MessageID列上的表A和表B之間的關係。刪除規則設置爲級聯。我無法改變這些表的設計,它就是這樣。

表A包含MessageID 1的兩條記錄。如果我只刪除其中一條記錄,則從表B中刪除子記錄,在第二個父表中創建一個孤兒。如果沒有其他父記錄共享MessageID,是否有辦法刪除?

回答

1

您可以創建一個trigger代替級聯刪除,例如(MS SQL-Server中,未經測試):

CREATE TRIGGER [dbo].[trDeleteTableB] ON [dbo].[TableA] 
    FOR DELETE 
    AS 
    DELETE FROM TableB 
    WHERE (MessageID IN 
     (SELECT MessageID 
      FROM DELETED 
      WHERE (NOT EXISTS 
       (SELECT * FROM TableA 
        WHERE (TableA.MessageID = DELETED.MessageID))))) 

另一個想法是延長您的類型化的DataSet。如果你想擴展功能,你不能在DatesetName.designer.cs/vb中更改生成的類(它會在任何更改時重新創建),而是在其名稱中沒有設計器的文件(如果它不存在,則創建它)。然後,您必須擴展部分DataTable類(如果不知道確切的名稱,請查看設計器文件,通常是f.e. TableBDataTable)。

看一看下面的代碼,看看我的意思是,我沒有測試過,但我希望你明白我的意思:

Partial Class Datset1 
    Partial Class TableBDataTable 
     Private Sub TableB_RowDeleting(ByVal sender As Object, ByVal e As TableBRowChangeEvent) Handles Me.TableBRowDeleting 
      If e.Action = DataRowAction.Delete Then 
       '*** check here if there is another TableARow with this MessageID ***' 
       e.Row.RejectChanges() 
      End If 
     End Sub 
    End Class 
End Class 
+0

我試圖做到這一點只在數據集。我不打算通過這些更改來更新SQL。 (我不會理解你的原因) – Bremer 2011-05-04 20:33:24

+0

刪除規則也在數據庫端。然後,您只有選擇刪除級聯刪除並檢查應用程序是否必須刪除子項。 – 2011-05-04 20:38:59

+0

這就是我所害怕的。謝謝。 – Bremer 2011-05-04 21:25:50