`
buliedian
  • 浏览: 1190803 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

当DataSet中包含主/子表时,Update更新步骤

阅读更多
当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 多表联合查询 dataset 多表联合查询 dataset 多表联合查询 dataset 多表联合查询

    ASP.NET 绑定DataSet中的多个表

    今天在论坛遇到有人问如何在ASP.NET的数据控件中如何一次绑定多个表?这个问题,平时很少看到,一般在数据绑定之前,数据都是放在一个表中的,实际上,如果表之间存在关系...下面就是 DataSet中两个表进行绑定的例子。

    Dataset_数据集.zip

    这是一个Zip文件,包含flowers数据集、BSDS500数据集及地面真值的图、BSDS300、C50数据集和VOCtrainval_06-Nov-2007数据集等等~

    C#通过DataSet读写xml文件的方法

    本文实例讲述了C#通过DataSet读写xml文件的方法。分享给大家供大家参考。具体实现方法如下: DataSet ds = new DataSet(); //读取Xml文件 ds.ReadXml(Server.MapPath(xml/song.xml)); //生成Xml文件 ds.WriteXml...

    DataSet详细用法(最全面)

    、可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法。 、处理分级数据 、缓存更改 、XML的完整性:DataSet对象和XML文档几乎是可互换的。 、创建DataSet对象: 、查看调用SqlDataAdapter....

    ASP.NET以更新DataTable/DataSet方式访问数据库

    该例ADO.NET中非常重要的案例,也是ADO.NET的核心操作。与常见的访问数据库操作不一样,该操作选择用DataTable/DataSet作为缓冲,用户操作数据库实际上并未在后台数据库直接修改,而是在DataTable/DataSet上进行;...

    SqlDataAdapter 向一个dataset中添加多个数据表例子

    本事例详细介绍了一个向一个DATASET中添加多个DATATABLE的例子,用户可以根据名称,取出在DATASET中不同的DATATABLE。

    C#中DataSet的用法(很详细)

    DataSet是ADO.NET开发人员为方便数据处理开发出来的,是数据的集合。DataSet的功能:浏览、排序、搜索、过滤、处理分级数据、缓存...DataSet中可包括多个DataTable,可将多个查询结构存到一个DataSet中,方便操作.....

    excel 导入数据库

    举例excel导入数据库 ... /// &lt;param name="tableName"&gt;Excel表名称&lt;/param&gt; /// &lt;returns&gt;&lt;/returns&gt; public static System.Data.DataSet ExcelSqlConnection(string filepath, string tableName)

    dataset

    dataset導入到excel

    DeepMind Q&A Dataset: CNN/Daily Mail Stories 文本摘要数据集 百度云

    DeepMind Q&A Dataset: CNN/Daily Mail Stories 文本摘要数据集 百度云 https://cs.nyu.edu/~kcho/DMQA/

    the MNIST Dataset

    the MNIST Dataset (http://yann.lecun.com/exdb/mnist/).

    asp.net使用DataSet数据集插入表记录

    asp.net使用DataSet数据集插入表记录

    jmeterCSV插件Extended CSV dataset config

    插件支持jmeter像loadrunner一样自定义参数化取值方法,与loadrunner一样支持,Sequential、Unique和Random;支持Each Iteration和Once;插件来着github; Jmeter 版本 5.2.1 或更高版本 Java 8 或更高版本

    dataset中自动序号实现

    dataset中的自动序号的实现方法!、

    DataSet多表查询(源码)

    文件有DataSet多表查询的源码、说明文件、使用帮助文件。用c#实现的DataSet多表关联查询功能。 开发环境:2.0框架+VS2008

    深入了解DataSet PDF

    在本次讲座中我们将进一步给大家介绍一些深入的知识,包括DataSet架构、模式推断、XML序列化等相关知识。&lt;br/&gt;&lt;br/&gt;课程讲师:&lt;br/&gt;邵志东 MSDN特邀讲师 北京新科海学校 副总经理&lt;br/&gt;&lt;br/&gt;技术等级:&lt;br/&gt;Level 200...

    DataSet导入Excel表格中

    DataSet导入Excel表格中

Global site tag (gtag.js) - Google Analytics