当DataSet中包含主/子表时,Update更新步骤
(一) 序幕
当DataSet中同时包含主/子表(主键表/外键表)时,有时候关系约束太严格:
比如, 关系数据库完整性规则:
1.实体完整性. 主键表中主键不准为空.
2.参照完整性. 外键表中外键的值必须与主键表中的主键对应.
要么为空,要么为主键表中的一主键值.
3.自定义完整性.
如果DataSet表中定义的多表关系约束太严密,直接用Update方法
将DataSet中多表一起提交时,有可能不满足完整性规则,会发生错误,
原因: 举个例子,设为两个表: CompanyMain(公司主表)和CompanySon(公司子表)
CompanyMain(公司主表)主要存储一个公司的基本信息,CompanySon(公司子表)
主要存储此公司的一些客户的信息. 并且公司主表中的(ID)与子表中的(BelongID)
建立关联,即主外键关系; 一个公司对应着多个客户,即ID:BelongID = 1 : n关系.
主表的ID为自动生成编号.
那么:
在新增公司界面,一起提交时,系统是不会遵守"数据库完整性规则"来更新到数据库的.
如果它先更新子表,再更新主表有可能就会报错. 原因是主表的公司信息还没有插入
到数据库中的表,也就没有生成公司编号: ID,则子表更新时就会没有对应的BelongID.
这时如果设置了: "外键表中的外键不为null"完整性规则,就会引发异常.
这只是一种出错的可能,还有更多的出错可能性,在分布式设计中更容易出现这样的错误.
(二). 解决办法
一般遵守以下几条规则,就会避免大量的出错机率.
1规则. 在DataSet更新之前按 <表> 和 <表的RowState属性>进行拆分提交
I. 按 <表> 进行拆分提交意思是说:
对DataSet 中的表不是一起提交,而是一次提交一个表,进行多次提交
II.按 <表的RowState属性>进行拆分提交意思是说:
对DataSet中的单个表根据RowState属性,再进行拆分,对RowState
相同的进行一次提交,也是提交多次
2.规则.
在规则1基础上, 先更新状态为<新增> 和 <修改> 的,再更新<删除的>
即: 先更新DataRowState 值为: Added和Modified的,再更新: Deleted的.
3.规则
在规则1和规则2基础上,如果DataRowState为Added和Modified,则先更新主表,后更新子表.
在规则1和规则2基础上,如果DataRowState为Deleted,则先更新子表,后更新主表.
(三) 归纳一下上面三条规则,如下:
1.将DataSet中的表拆分,并根据RowState将各个表记录进行分组并存储在不同的数据集中
//这里要存储在DataSet中,是因为: Update接受的是DataSet的参数,还有WebService只支持
//DataSet,对其进行序列化操作
代码示例:
设待更新的数据集为: dsCompany(里面包括两个表,分别为主表和子表,并存储了
数据,待更新)
//dtCompanyMain存储公司主表信息,dtCompanySon存储公司子表信息
DataTable dtCompanyMail = ds.Tables["dtCompanyMain"].Clone(); //分离出主表数据
并存储另一对象
DataTable dtCompanySon = ds.Talbes["dtCompanySon"].Clone(); //分离出子表数据
并存储另一对象
DataSet dsAdded = new DataSet(); //存放主表 新增 的数据
DataSet dsMidified = new DataSet(); //存储主表 编辑 的行记录
DataSet dsDeleted = new DataSet(); //存储主表 删除 的行记录
dsAdded = dtCompanyMain.GetChanges(DataRowState.Added); //取得主表中新增的行
记录集
dsMidified = dtCompanyMain.GetChanges(DataRowState.Modified); //取得主表中编
辑的行记录集
dsDeleted = dtCompanyMain.GetChanges(DataRowState.Deleted); //取得主表中删除的
行记录集
2.更新主表DataRowState状态为: Added和Modified的记录.
SqlDataAdapter.Update(dsAdded,"dtCompanyMain"); //更新添加的记录集到数据库
SqlDataAdapter.Update(dsModified,"dtCompanyMain"); //更新修改的记录集到数据
库
3.更新子表DataRowState状态为: Added和Modified的记录
............. //代码省略,跟2主表更新类似
4.更新子表DataRowState状态为: Deleted的记录.
............ // 代码省略,与下面5类似
5.更新主表DataRowState状态为: Deleted的记录
SqlDataAdapter.Update(dsDeleted,"dtCompanyMain"); //更新修改的记录集到数据库
分享到:
相关推荐
dataset 多表操作 dataset 多表操作 dataset 多表操作 dataset 多表操作
怎样将DataSet中修改(增加_删除_修改)过的记录更新进数据库中怎样将DataSet中修改(增加_删除_修改)过的记录更新进数据库中
dataset 多表联合查询 dataset 多表联合查询 dataset 多表联合查询 dataset 多表联合查询 dataset 多表联合查询 dataset 多表联合查询 dataset 多表联合查询
今天在论坛遇到有人问如何在ASP.NET的数据控件中如何一次绑定多个表?这个问题,平时很少看到,一般在数据绑定之前,数据都是放在一个表中的,实际上,如果表之间存在关系...下面就是 DataSet中两个表进行绑定的例子。
这是一个Zip文件,包含flowers数据集、BSDS500数据集及地面真值的图、BSDS300、C50数据集和VOCtrainval_06-Nov-2007数据集等等~
本文实例讲述了C#通过DataSet读写xml文件的方法。分享给大家供大家参考。具体实现方法如下: DataSet ds = new DataSet(); //读取Xml文件 ds.ReadXml(Server.MapPath(xml/song.xml)); //生成Xml文件 ds.WriteXml...
、可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法。 、处理分级数据 、缓存更改 、XML的完整性:DataSet对象和XML文档几乎是可互换的。 、创建DataSet对象: 、查看调用SqlDataAdapter....
该例ADO.NET中非常重要的案例,也是ADO.NET的核心操作。与常见的访问数据库操作不一样,该操作选择用DataTable/DataSet作为缓冲,用户操作数据库实际上并未在后台数据库直接修改,而是在DataTable/DataSet上进行;...
本事例详细介绍了一个向一个DATASET中添加多个DATATABLE的例子,用户可以根据名称,取出在DATASET中不同的DATATABLE。
DataSet是ADO.NET开发人员为方便数据处理开发出来的,是数据的集合。DataSet的功能:浏览、排序、搜索、过滤、处理分级数据、缓存...DataSet中可包括多个DataTable,可将多个查询结构存到一个DataSet中,方便操作.....
举例excel导入数据库 ... /// <param name="tableName">Excel表名称</param> /// <returns></returns> public static System.Data.DataSet ExcelSqlConnection(string filepath, string tableName)
dataset導入到excel
DeepMind Q&A Dataset: CNN/Daily Mail Stories 文本摘要数据集 百度云 https://cs.nyu.edu/~kcho/DMQA/
the MNIST Dataset (http://yann.lecun.com/exdb/mnist/).
asp.net使用DataSet数据集插入表记录
插件支持jmeter像loadrunner一样自定义参数化取值方法,与loadrunner一样支持,Sequential、Unique和Random;支持Each Iteration和Once;插件来着github; Jmeter 版本 5.2.1 或更高版本 Java 8 或更高版本
dataset中的自动序号的实现方法!、
文件有DataSet多表查询的源码、说明文件、使用帮助文件。用c#实现的DataSet多表关联查询功能。 开发环境:2.0框架+VS2008
在本次讲座中我们将进一步给大家介绍一些深入的知识,包括DataSet架构、模式推断、XML序列化等相关知识。<br/><br/>课程讲师:<br/>邵志东 MSDN特邀讲师 北京新科海学校 副总经理<br/><br/>技术等级:<br/>Level 200...
DataSet导入Excel表格中