(一) 序幕 当DataSet中同时包含主/子表(主键表/外键表)时有时候关系约束太严格比如 关系数据库完整性规则实体完整性 主键表中主键不准为空 参照完整性 外键表中外键的值必须与主键表中的主键对应 要么为空要么为主键表中的一主键值 自定义完整性 如果DataSet表中定义的多表关系约束太严密直接用Update方法将DataSet中多表一起提交时有可能不满足完整性规则会发生错误原因 举个例子设为两个表 CompanyMain(公司主表)和CompanySon(公司子表) CompanyMain(公司主表)主要存储一个公司的基本信息CompanySon(公司子表) 主要存储此公司的一些客户的信息 并且公司主表中的(ID)与子表中的(BelongID) 建立关联即主外键关系 一个公司对应着多个客户即IDBelongID = n关系 主表的ID为自动生成编号 那么在新增公司界面一起提交时系统是不会遵守数据库完整性规则来更新到数据库的 如果它先更新子表再更新主表有可能就会报错 原因是主表的公司信息还没有插入到数据库中的表也就没有生成公司编号 ID则子表更新时就会没有对应的BelongID这时如果设置了 外键表中的外键不为null完整性规则就会引发异常 这只是一种出错的可能还有更多的出错可能性在分布式设计中更容易出现这样的错误 (二) 解决办法 一般遵守以下几条规则就会避免大量的出错机率 规则 在DataSet更新之前按 <表> 和 <表的RowState属性>进行拆分提交 I 按 <表> 进行拆分提交意思是说 对DataSet 中的表不是一起提交而是一次提交一个表进行多次提交 II按 <表的RowState属性>进行拆分提交意思是说 对DataSet中的单个表根据RowState属性再进行拆分对RowState 相同的进行一次提交也是提交多次 规则 在规则基础上 先更新状态为<新增> 和 <修改> 的再更新<删除的> 即 先更新DataRowState 值为 Added和Modified的再更新 Deleted的 规则 在规则和规则基础上如果DataRowState为Added和Modified则先更新主表后更新子表 在规则和规则基础上如果DataRowState为Deleted则先更新子表后更新主表 (三) 归纳一下上面三条规则如下 将DataSet中的表拆分并根据RowState将各个表记录进行分组并存储在不同的数据集中 //这里要存储在DataSet中是因为 Update接受的是DataSet的参数还有WebService只支持 //DataSet对其进行序列化操作 代码示例 设待更新的数据集为 dsCompany(里面包括两个表分别为主表和子表并存储了 数据待更新) //dtCompanyMain存储公司主表信息dtCompanySon存储公司子表信息 DataTable dtCompanyMail = dsTables[dtCompanyMain]Clone() //分离出主表数据 并存储另一对象 DataTable dtCompanySon = dsTalbes[dtCompanySon]Clone() //分离出子表数据 并存储另一对象 DataSet dsAdded = new DataSet() //存放主表 新增 的数据 DataSet dsMidified = new DataSet() //存储主表 编辑 的行记录 DataSet dsDeleted = new DataSet() //存储主表 删除 的行记录 dsAdded = dtCompanyMainGetChanges(DataRowStateAdded) //取得主表中新增的行 记录集 dsMidified = dtCompanyMainGetChanges(DataRowStateModified) //取得主表中编 辑的行记录集 dsDeleted = dtCompanyMainGetChanges(DataRowStateDeleted) //取得主表中删除的 行记录集 更新主表DataRowState状态为 Added和Modified的记录 SqlDataAdapterUpdate(dsAddeddtCompanyMain) //更新添加的记录集到数据库 SqlDataAdapterUpdate(dsModifieddtCompanyMain) //更新修改的记录集到数据 库 更新子表DataRowState状态为 Added和Modified的记录 …… //代码省略跟主表更新类似 更新子表DataRowState状态为 Deleted的记录 …… // 代码省略与下面类似 更新主表DataRowState状态为 Deleted的记录 SqlDataAdapterUpdate(dsDeleteddtCompanyMain) //更新修改的记录集到数据库 |