通常情况下,在删除数据库中的记录时需要对所有相关记录执行一些操作: 删除相关记录,将它的重新分配给其他记录( 更改外键),或者删除有关关系( 空外键)的信息。
例如假设你有一个雇员表和一个缺陷表,员工表中的雇员的一个记录将被删除。 如何处理分配给该员工的所有缺陷是一个两难的问题: 删除,保留它们给任何雇员,或者分配给其他员工? 这个问题会变得更加困难,如果存在许多多级关系。
下面描述的机制将允许你处理这个问题,提供的源将帮助你检索这些相关记录。
DataSet
。 上面提到的示例将从员工表中删除一个记录,并从缺陷表中删除所有相关记录。DataSet
。 应用程序可能会通知用户相关的记录,并限制删除。 或者要求批准删除相关记录,或者更改这些记录的外键。更好地锁定记录以进行编辑,只有一个用户可以以使用它。
注意:本文中没有讨论锁定记录主题。 以及其他不允许用户在这里操作期间修改或者添加记录的解决方案。
检索所有相关记录( 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
之后,你可以检查是否有相关的记录。 例如你可以检查是否存在相关的缺陷。
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);