日期:2012-03-10  浏览次数:21035 次


    数据整形或分层的记录集能显示一个树状结构或相关记录集。这通过在记录集的字段中包含一个记录集来实现,可以展现数据库的关系,而且多个记录集能在一次调用中返回。有两个理由可以解释它为什么是有用的:
· 性能:当正确使用时,数据整形可以改善性能。
· 便利:在数据整形中非常容易映射父子关系。
要知道数据整形涉及到哪些内容,最简单的方法是看图9-8所示的内容:

图9-8显示了Pubs数据库中表Publishers、Titles及Sales的层次关系。
值得注意的一点是每个子记录集都不是独立的记录集。因此,图9-8中只有三个记录集,而不是六个。这是怎么来的呢?在层次关系中每一层都有一个记录集,分别是Publishers、Title和Sales。在Publishers表中引用标题时,实际上是引用了Titles记录集,但ADO过滤了Titles,所以只显示那些与被选择的出版社对应的记录。这就容易使人误以为每个子元素有一个独立的记录集。

9.4.1 使用数据整形
应用数据整形必须:
· 使用MSDataShape OLEDB提供者。
· 使用一种特殊的整形语言,它是SQL的一种扩充,允许构造层次。
尽管使用新的提供者,连接字符串的实际改变不会太大。这是因为仍然需要从某处获取数据。因此,可以这么做:
Provider=MSDataShape; Data Provider=SQLOLEDB; Data Source=...
这里用MSDataShape作为提供者,而正常的Provider变为Data Provider,而连接字符串的剩余部分保持不变。
为数据整形创建连接字符串的简便方法是从创建正规的连接字符串开始,然后附加到数据整形块的最后。例如,考虑以下正规的连接字符串。
strConn = "Provider=SQLOLEDB; Data Source=Kanga; " & _
              " Initial Catalog=pubs; User Id=sa; Password="
可以像下面这样为数据整形提供者创建连接字符串。
strConn = "Provider=MSDataShape; Data " & strConn
这将提供者设置为MSDataShape,而Data Provider成为实际的数据源。初始的连接字符串已经包含了"Provider= ",所以为了获得正确的连接细节,只须前面加上Data。
1.  整形语言
整形语言有其自己的语法,但这里我们不打算涉及其构造,它已包含在ADO文献中。大多数情况下会采用以下命令。
SHAPE {parent command} [AS parent alias]
APPEND ({child command} [AS child alias]
RELATE parent_column TO child_column) [AS parent_column_name]
要理解这一点,最简单的方法是看一个实例,以Publishers和Titles为例。
SHAPE {SELECT * FROM publishers}
APPEND ({SELECT * FROM Titles}
RELATE Pub_ID TO PubID) AS rsTitles
第一行是父记录集,第二行则是子记录集。第三行指明了关联父、子记录集的两个字段。这个例子中两个表都有一个名为Pub_ID的字段(出版社ID字段)。这个命令返回一个包含出版社的记录集,在记录集的最后又附加了一个含有子记录集的新列(类型为adChapter)。该列名为AS子句给出,在本例中是rsTitles。
adChapter类型只是说明了该字段含有一个子记录集。我个人认为,adChild或adRecordset更合适。
通过遍历Fields集合,可以很容易看到父记录集的字段的情况。对于上面的SHAPE命令,得到图9-9所示的结果:

访问子记录集
现在,我们有了一个子记录集,它是另一个记录集的一个字段,那么如何访问这个子记录集呢?很简单,可以使用字段的Value属性来建立另一个记录集。
Set rsTitles = rsPublishers("rsTitles").Value
可以遍历父记录集,对应于每个父记录可以得到一个子记录集。下面的代码能实现这一点。通常以包含文件、变量声明开始。
<!-- #INCLUDE FILE="../Include/Connection.asp" -->
<%
Dim rsPublishers
Dim fldF
Dim strShapeConn
Dim strShape

Set rsPublishers = Server.CreateObject ("ADODB.Recordset")
现在创建连接字符串。
' Create the provider command
strShapeConn = "Provider=MSDataShape; Data " & strConn
接下来,输入实际的整形命令。这将创建一个包含出版社的父记录集和一个含有书名的子记录集。
' now the shape command
strShape = "SHAPE {SELECT * FROM Publishers}" & _
           " APPEND ({SELECT * FROM Titles}" & _
           " RELATE Pub_ID TO Pub_ID) AS rsTitles"
然后正常打开记录集。
' Open the shaped recordset
rsPublishers.Open strShape, strShapeConn
像正常的记录集一样,能够遍历记录。
' loop through the publishers
Response.Write "<UL>"
While Not rsPublishers.EOF
    Response.Write "<LI>" & rsPublishers("pub_name")
为了访问子记录集,设置一个变量来指向那个包含子记录集的字段的Value值。本例中该变量为rsTitles。
' now the titles
Response.Write "<UL>"
Set rsTitles = rsPublishers("rsTitles").Value
变量rsTitles在这里是个记录集,其作用同普通的记录集相同。因此,可以遍历该记录集的值,该值只包含与父出版者匹配的书名。
' loop through the titles
    While Not rsTitles.EOF
      Response.Write "<LI>" & rsTitles("title")
      rsTitles.MoveNext