21.9.1 分层开发
开发与数据交互操作的应用程序时,常常要把应用程序分层,常见的模型是一个应用层(前端)、一个数据服务层和数据库本身。
但使用这个模型的难题是,确定在层之间传输什么数据,以及应采用什么格式来传输数据。有了ADO.NET,就不必担心这个问题了,这种结构一开始就提供了这种支持。
1. 复制和合并数据
如何复制完整的OleDb记录集?在.NET中,这是很简单的,只需复制DataSet即可:
DataSet source = {some dataset};
DataSet dest = source.Copy();
这将创建源DataSet的一个附加副本—— 所有的DataTables、DataColumns、DataRows和Relations都会被逐字地复制下来,所有的数据所处的状态都与它在源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





