Vb.net 使用外键从绑定源中删除行

Vb.net 使用外键从绑定源中删除行,vb.net,datatable,sql-delete,Vb.net,Datatable,Sql Delete,我有一个数据源,有两个表,一个是ProjectDiameter,另一个是diameterSet。ProjectDiameter id包含主键,diameterset具有具有相同键的外键约束 现在,当我从projectdiameter表中选择行diameterset DataGridView时,会相应地进行过滤。我在diameterset中有很多行(比如说,仅选定项目有15000行),我想在按下delete按钮时删除这些行 我想知道从DataGridView和SQL表中删除它的最快方法是什么 我尝

我有一个数据源,有两个表,一个是ProjectDiameter,另一个是diameterSet。ProjectDiameter id包含主键,diameterset具有具有相同键的外键约束

现在,当我从projectdiameter表中选择行diameterset DataGridView时,会相应地进行过滤。我在diameterset中有很多行(比如说,仅选定项目有15000行),我想在按下delete按钮时删除这些行

我想知道从DataGridView和SQL表中删除它的最快方法是什么

我尝试了以下代码,但想检查是否有更好的方法来获得相同的代码

FKProjectDiameterBindingSource.MoveFirst()
For j As Int16 = 0 To FKProjectDiameterBindingSource.Count - 1
    For i As Int16 = 0 To FKDiameterDiameterSetBindingSource.Count - 1
        FKDiameterDiameterSetBindingSource.Clear()
        FKDiameterDiameterSetBindingSource.MoveFirst()
        FKDiameterDiameterSetBindingSource.RemoveCurrent()
    Next
    FKProjectDiameterBindingSource.MoveNext()
Next

Me.Validate()
DiameterTableAdapter.Update(RSM3DDB1.Diameter)
DiameterSetTableAdapter.Update(RSM3DDB1.DiameterSet)

外键关系是否正式存在于数据库中?也就是说,SQL中是否定义了实际的关系?如果是这样,我建议将该关系设置为CASCADE DELETE,然后只需在更新Diameter后调用DiameterSetTableAdapter.UPDATE

这里有一个关于级联删除的很好的解释 请注意,该关键字只是“级联”,但您可以将其应用于删除,文章解释道(“更新和删除操作不必应用相同的规则。对于单个FK约束,更新和删除操作可能有不同的规则。”)

如果关系不是正式的,也就是说它在逻辑上存在,但没有强制执行,那么我会在Diameter表上放置一个触发器,并在该触发器中删除DiameterSet中DiameterID等于已删除DiameterID的所有行。请注意,在触发器中,已修改(而不是已删除)的行将同时位于插入的临时表和已删除的临时表中,因此必须采取步骤确保未删除引用已修改直径的行

如果采用第二种方法,仍然可以在VB中的2个表适配器上运行2个更新过程,这只是在SQL中进行编码,而不是设置级联删除

这两种方法都比在VB中进行更有效,并且如果您有数百行受影响,那么这两种方法可以相加


使用这两种方法中的任何一种都有原子化的优点,而您的方法不是原子化的。

在这种情况下,直径是什么?很抱歉混淆,直径是主表(即前面提到的项目),直径集是带有外键约束的表。我已据此进行了编辑。您是否正在尝试从[DiameterSet]中删除此SQL
,其中ProjectID=@ProjectID
,并将更改反映在您的UI上?非常感谢您的回复。。。。在一个实例中实现了级联,工作起来非常有魅力。。。。唯一的问题是,我想删除在父表(datagridview行)中选择了特定键的唯一子表项。使用cascade,我可以删除子表行,但请保留在父表中吗?您可以很容易地做到这一点,尽管不使用cascade,只需执行SQL查询,删除具有该直径的所有行。在SQL中,创建一个以DiameterID为参数的存储过程,并在主体中删除DiameterSet中具有该DiameterID的所有行。在VB中,创建一个QueryTableAdapter(或添加到现有的QueryTableAdapter)并添加对该StoredProcess的调用,然后在Me之后的代码中。验证创建该QueryTableAdapter的实例并使用它调用存储过程。然后使用表适配器的FILL方法重新加载数据。在空间之外,我应该扩展这个来回答吗?