65.9K
CodeProject 正在变化。 阅读更多。
Home

删除机制。

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.88/5 (7投票s)

2005年1月17日

3分钟阅读

viewsIcon

33364

downloadIcon

403

解释当所选记录在其他表中存在相关记录时删除记录的机制。

引言

在从数据库中删除记录时,经常需要对所有相关记录执行某些操作:删除相关记录、将它们重新分配给另一条记录(更改外键),或删除关于关系的的信息(空外键)。

例如,假设您有一个 Employees 表和一个 Defects 表,并且要从 Employees 表中删除一条员工记录。 那么问题来了,如何处理分配给该员工的所有 Defects:删除它们、让它们不分配给任何员工,还是将它们分配给另一位员工? 如果存在许多多级关系,这个问题会变得更加困难。

下面描述的机制将允许您处理此问题,提供的源代码将帮助您检索这些相关记录。

提出的处理该问题的方案-计划

  1. 用户请求删除特定记录。
  2. 从数据库中检索所有相关记录(ID 和外键)到 DataSet 中。 在上面提到的例子中,将有一条来自 Employees 表的记录要被删除,以及来自 Defects 表的所有相关记录(ID 和外键)。
  3. 评估检索到的 DataSet,如果存在任何相关记录。 在最简单的情况下,应用程序可能会通知用户有关相关记录的信息并限制删除。 或者它可能会要求批准删除相关记录,或者更改这些记录的外键。
  4. 将更改保存到数据库。

详细说明

用户请求删除特定记录

最好锁定该记录以进行编辑,这样只有一位用户可以处理它。

注意:本文未讨论锁定记录的主题。 同样,本文也没有讨论不允许用户在此操作期间修改或添加记录的其他解决方案。

检索所有相关记录

检索所有相关记录(ID 和主键),以便决定并对这些记录执行特定操作。 为此,有一个实用程序函数。 它返回与给定表相关的不同表中的相关记录 - 记录。 您可以在 DBDeleteHelper 的类中找到它,位于 MohawkIDEAS.Utils 命名空间下。

public DataSet GetRelatedTables(SqlConnection con, 
    string strTableName, string strFieldName ,int iID);
  • con - 活动连接。
  • strTableName - 记录所属的表名。
  • strFieldName – 主字段名。
  • iID – 您要检索相关记录的记录 ID。

表以这样的方式排列,首先是关联性最小的表(叶)。 最后是主表。 这些表排列如下

因此,如果您想删除 ID 为 12 的员工,您将调用该函数

DataSet _ds=GetRelatedTables(con, “employees”,”ID”,12);

评估检索到的 DataSet

检索到 DataSet 后,您可以检查是否存在任何相关记录。 例如,您可以检查是否存在任何相关缺陷。

If (_ds.Tables[“Defects”].Rows.Count>0 )

{

…

}

如果存在任何相关记录,则有以下选项

  • 可以通知用户无法删除所选记录,因为存在相关记录,并且取消删除。
  • 所有相关记录也可以标记为删除
    foreach (System.Data.DataRow _row in _ds.Tables["Defects"].Rows)
    
    {
    
        _row.Delete();
    
    }
  • 可以通过更改外键值来更新相关记录(分配给另一位员工)
    int _iID;
    _iID = ChooseNewResposibleEmploee();
    
    foreach (System.Data.DataRow _row in _ds.Tables["Defects"].Rows)
    {
        _row[“EmployeeID”]= _iID; //Another Employee id
    }

将更改保存到数据库

如果未取消删除,则应发送更新的 DataSet 以进行更新

DataAdapter.Update(_ds);
© . All rights reserved.