ADO 使您能够回答其答案可表示为 Recordset 的提问。例如,假设您要公司客户的列表,而您有包含名为 Customers 的表的数据库。对表发出查询命令,则 ADO 将返回 Recordset,在 Recordset 中每个行表示一个客户,并且每个行的列拥有能够包含客户的名称、地址、客户 ID 等内容的数据类型。
“数据构形”使您能够回答其答案可由成形的 Recordset 表示的提问。数据构形定义成形 Recordset 的列、由列表示条目之间的关系和数据充填到 Recordset 的方式。
成形 Recordset 的列可以包含来自数据提供者(如 SQL Server)的数据、对另一个 Recordset 的引用、对 Recordset 一个行进行计算得到的值、对整个 Recordset 的列进行操作所得到的值,或者可以是新虚构的空列。
在检索包含对另一个 Recordset 的引用的列的值时,ADO 将自动返回由引用表示的实际的 Recordset。包含另一个 Recordset 的 Recordset 称为“分级 Recordset”或“分级游标”。
例如,假定您要得到由公司每个客户发出的所有定单的列表。可对包含名为 Customers 和 Orders 的数据库表发出数据构形命令。如同上例一样,ADO 将返回客户记录 Recordset。但是,每行将同时有附加的列,该列引用包含所有该客户定单的 Recordset。
改进该形状即可获得按州排列的销售总计的列表。在 Customers 表中的地址列包含每个客户的州,而 Orders 表的数量列则包含每个定单的数量。发出不同的数据构形命令,则 ADO 将返回 Recordset,该 Recordset 包含每个州一个行(在此,每个行包含标识州的列)、该州所有定单的销售量总计和对开列该州的所有客户的 Recordset 的引用。访问该客户 Recordset 将会发现与前面的范例一样,每个客户行均含有对包含所有该客户定单的 Recordset 的引用。
Shape 命令语法使您能够通过编程创建成形的 Recordset。然后就可以通过编程或适当的可视化控件,访问 Recordset 的组件。
数据构形纵览
ADO 2.0 推出了数据构形功能、分级记录集和 Shape 命令语法。
ADO 2.1 通过插入 COMPUTE 命令推出重构形、孙子合计和参数化命令。
数据构形
数据构形使您能够定义成形 Recordset 的列、由列表示的条目之间的关系和数据充填到 Recordset 的方式。
成形 Recordset 的列可以包含数据、对另一个 Recordset 的引用、对 Recordset 一个行进行计算得到的值、对整个 Recordset 的列进行操作所得到的值,或者可以是新虚构的空列。
在检索包含对另一个 Recordset 的引用的列的值时,ADO 将自动返回由引用表示的实际的 Recordset。包含另一个 Recordset 的 Recordset 被称为“分级 Recordset”。分级 Recordsets 展示的是父-子关系,其中“父”是包含的 Recordset,而“子”是被包含的 Recordset。对 Recordset 的引用实际是对子的子集合(即“子集”)的引用。单个父可以包含多个子 Recordset。
ADO 2.0 同时推出了新的 Shape 命令语法,能够通过编程创建成形的 Recordset 对象。Shape 命令可以象其他任何 ADO 命令文本一样发出。
使用 Shape 命令语法,可通过两种途径创建分级的 Recordset 对象。其一是将子 Recordset 追加到父 Recordset,一般,父和子至少必需有一个列:在父的行中列的值与子的所有行中列的值相同。
其二则是从子 Recordset 产生父 Recordset。在引用子 Recordset 的父中,必须有子集列。创建其他父列的途径是:对子列的合计运算,运算 Recordset 行的表达式,使用 BY 关键字指定分组的列,或追加新的空列。
可将分级 Recordset 对象嵌套到所需的任何深度(即创建子 Recordset 对象的子 Recordset 对象,如此继续)。
通过程序或相应的可视控件,可以访问成形的 Recordset 的 Recordset 组件。
Microsoft 提供了能够生成 Shape 命令的可视化工具(请参阅 Visual Basic 主题,“数据环境设计者”)以及另一个能够显示分级游标的可视化工具(请参阅 Visual Basic 主题,“使用 Microsoft Hierarchical Flexgrid Control”)。
重构形
由 Shape 命令的子句创建的 Recordset 可以被赋值为“别名”(一般使用 AS 关键字)。在 ADO 2.1 中,成形 Recordset 的别名可以在完全不同的命令中引用。就是说,可以发出新的 Shape 命令来更改(即重构形)以前构形的 Recordset。为了支持该功能,ADO 提供了新的 Recordset 对象 Name 属性。
所受限制为不可以将列追加到现有的 Recordset 中,或在任何插入 COMPUTE 的子句中对参数化的 Recordset 或 Recordset 对象进行重构形,或对除正在被构形的 Recordset 以外的任何 Recordset 执行合计操作。
孙子合计
用 Shape 命令的子句创建的子集列可以得到“子集-别名名称”(一般使用 AS 关键字)。可以使用用以标识包含了列的子的完整名称,在子集中标识成形 Recordset 的任何列。例如,如果父子集 chap1 包含拥有数量列 amt 的子子集 chap2,那么完整名称将是 chap1.chap2.amt。然后,完整名称可以用作参数在合计函数 (SUM, AVG, MAX, MIN, COUNT, STDEV, or ANY) 中使用。
使用插入 COMPUTE 命令的参数化命令
典型的参数化形状 APPEND 命令含有通过查询命令创建父 Recordset 的子句,以及通过参数化查询命令(即包含参数占位符:问号“?”的命令)创建子 Recordset 的另一个子句。最终得到的成形 Recordset 有两层,父在上层而子占据下层。
创建子 Recordset 的子句现在可以是任意数量的嵌套形状 COMPUTE 命令,在最深的嵌套命令中包含了参数化查询。所得到的成形 Recordset 有多层,父占据最上层,子占据最下层,而由形状 COMPUTE 命令生成的任意数量 Recordsets 则占据插入的层。
该特性典型的用法是调用合计函数和形状 COMPUTE 命令的分组功能,创建带有有关子 Recordset 的分析信息的插入 Recordset 对象。总之,因为这是参数化 Shape 命令,每当父的子集列被访问时,就可检索新的子 Recordset。因为插入层来源于子,它们也将被重新计算