首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

21.9.1  分层开发

开发与数据交互操作的应用程序时,常常要把应用程序分层,常见的模型是一个应用层(前端)、一个数据服务层和数据库本身。

但使用这个模型的难题是,确定在层之间传输什么数据,以及应采用什么格式来传输数据。有了ADO.NET,就不必担心这个问题了,这种结构一开始就提供了这种支持。

1. 复制和合并数据

如何复制完整的OleDb记录集?在.NET中,这是很简单的,只需复制DataSet即可:

DataSet source = {some dataset};

DataSet dest = source.Copy();

这将创建源DataSet的一个附加副本—— 所有的DataTablesDataColumnsDataRowsRelations都会被逐字地复制下来,所有的数据所处的状态都与它在源DataSet中所处的状态完全相同。如果只需要复制DataSet的模式,可以试试下面的代码:

DataSet source = {some dataset};

DataSet dest = source.Clone();

这也会复制所有的表、关系等,但每个复制的DataTable都是空的。这个过程非常简单。

在编写一个分层的系统(无论该系统是基于Win32还是基于Web)时,常见的要求是在层之间附带尽可能少的数据。这减少了资源的消耗。

要达到这个要求,DataSet类有一个GetChanges()方法,这个简单的方法执行许多任务,返回一个DataSet,其中只包含源数据集中修改过的行。这是在层之间传输数据时最理想的情况,因为只有很少量的数据在网络上传输。

下面的示例说明了如何生成对DataSet的一个修改:

DataSet source = {some dataset};

DataSet dest = source.GetChanges();

这是很乏味的,下面介绍的内容会比较有趣。GetChanges方法有两个重载形式,一个重载方法的参数是一个DataRowState枚举的值,返回对应于该状态的行。GetChanges()只调用GetChanges(Deleted | Modified | Added),该方法首先检查,以确保调用HasChanges进行了一些修改,如果没有修改,就立即给调用者返回空值。

下一个操作是复制当前的DataSet,完成后,会设置新的DataSet,以忽略违反约束的情况(EnforceConstraints = false),然后,把每个表中所有修改的行都复制到新的DataSet中。

 

 

在得到一个只包含修改内容的DataSet后,就可以把它们移动到数据服务层上进行处理。在数据在数据库中更新后,修改了的数据集就返回给调用者(例如,存储过程的一些输出参数在某些列上有更新的值),然后使用Merge()方法,把这些修改的内容合并到源DataSet中。操作的顺序如图21-9所示。

  21-9

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论