数据整形

数据

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

    ' move to the next publisher
    rsPublishers.MoveNext
  Wend
  Response.Write "</UL>"

  rsPublishers.Close
  Set rsPublishers = Nothing
  Set rsTitles = Nothing
%>
于是得到一份令人满意的出版社与书名的列表,如图9-10所示:

用一些DHTML代码和一些额外的标记,就能轻松地隐藏起书名,并且只有选择出版社时才显示相应的书名。
2.  多个子记录集
如果对于每个记录集仅能有一个子记录集,那么数据整形就不够完善。但数据整形是极其灵活的。例如可以使用下面的程序来为出版社引用标题和雇员。
SHAPE {select * from publishers}
APPEND ({select * from titles}
RELATE pub_id TO pub_id) AS rsTitles,
      ({select * from employee}
RELATE pub_id To pub_id) AS rsEmployees
只需在APPEND子句后加上其他子记录集,就能得到图9-11的结果:

访问子记录集的方法并没有改变,仍旧可以用列的Value属性访问子记录集。只是此时有两个子记录集,因此需要使用两个变量。
Set rsTitles = rsPublishers("rsTitles").Value

Set rsEmployees = rsPublishers("rsEmployees").Value
3.  孙代记录集
在子记录集自身还包含子记录集的情况下,可能会出现孙代记录集。例如:
SHAPE {SELECT * FROM Publishers}
APPEND ((    SHAPE {SELECT * FROM Titles}
                     APPEND ({SELECT * FROM Sales}
                     RELATE Title_ID TO Title_ID) AS rsSales)
RELATE Pub_ID TO Pub_ID) AS rsTitles
在第一个APPEND子句内是另一个SHAPE命令,而不是一个SELECT语句。与多个子记录集的例子相似,访问孙代记录集的方法是相同的。
Set rsTitles = rsPublishers("rsTitles").Value

Set rsSales = rsTitles("rsSales").Value
对子和孙记录集的深度没有理论上的限制,但也不可能建立多于三级或四级的子记录集。

9.4.2 性能
数据整形不会自动改善性能,但正确使用时可以改善性能。重要的是记住其工作方式:
· 对于SHAPE命令中的SELECT语句,将完全取出表中的数据。SQL语句并没有得到任何优化。这样,如果在父表中加入WHERE子句来限制父记录集的记录数,仍能得到所有的子记录集。例如:
SHAPE {SELECT * FROM Publishers WHERE State='CA'}
APPEND ({SELECT * FROM Titles}
RELATE Pub_ID TO Pub_ID) AS rsTitles
APPEND语句返回所有的标题,并不仅限于加州(CA)的出版社。记住,这不是SQL JOIN语句。在加州的出版社以及所有的标题都被提取了,这样就完成了数据整形。
· 可以使用存储过程,这会提高一点性能。然而,如果使用一个参数化的存储过程产生子记录集,那么每次访问子记录集时,这个存储过程都会执行。这意味着,子记录集不在前端代码中编程产生,而是只包含存在存储过程产生的那么记录。不足之处是增加了服务器的工作,但这样却能保证数据是最新的,因为每次需要时就从数据库中提取数据。
在下一章当我们着眼于客户端数据时,会看到更多有关经过整形的记录集的介绍。

9.5 小结在下面两章以及本书的其余部分将看到相关的其他知识。在后续章节将详细探讨Web服务器与浏览器之间的交互。毕竟,仅有数据是不行的,还要让人们看见这些数据。

时间: 2024-10-30 11:57:25

数据整形的相关文章

数据整形入门

数据 数据整形=============数据整形或分层的记录集能显示一个树状结构或相关记录.应用数据整形必须: 1.使用MSDataShape OLEDB提供者 Provider=MSDataShape;Data Provider=SQLOLEDB;DATA Source=.....比较简洁的方式如下:连接字符串:strCon="Provider=SQLOLEDB;Data source=servername;"&_       "Initial Catalog=de

你不知道的数据工程师:80% 时间都在做「大数据苦工」

以为数据工程师每天做的就是像 http://hackertyper.net/ 这样,然后创造了一个又一个伟大的产品吗?错了!纽约时报记者采访了多位大数据工程师,他们表示自己 80% 的时间都在当「大数据苦工」,干的都是非人类可以想象的枯燥繁琐的工作--从海量的原始数据中提取有用数据,整理,转换格式,调整为算法可以理解的同样格式的规整数据-- 因此,这些数据工程师称呼自己为「数据清洁工」.「数据搬运工」,「数据整形师」等等--知名健康追踪手环公司 Jawbone 的数据科学副总裁 Monica R

Connection对象

connection|对象     上一章讨论了ADO的基础知识,内容主要涉及Recordset对象以及对数据的处理.在大多数例子中,只是通过指定数据库的表名来获取数据,但正如从对象模型中看到的,ADO还有其他允许访问数据的对象.       本章将要更详细地介绍这些对象,特别将研究以下内容:       · Connection对象,以及如何用它来获取数据和运行命令.       · Command对象,为什么需要该对象及其所具有的功能.       · 如何运行存储过程,特别是那些需要参数的

浅谈ADO.NET与ADO!!

ado 最近老是看到有网友问关于ADO.NET和ADO的区别和好坏问题,想想自己在刚接触.NET时确实也有此疑问,现将我的一点理解和体会写来,希望能对大家有点帮助! 其实大部分东西还是来自MSDN!! ADO 对于用本机代码编写的应用程序,ADO 为 OLE DB 数据提供程序提供基于 COM 的应用程序级别接口.与 ADO.NET 相似,ADO 支持各种开发需要,包括使用与关系数据库和其他存储区中的数据的活连接来创建前端数据库客户端和中间层业务对象.而且,像 ADO.NET一样,ADO可构建客

用 Visual Studio LightSwitch 构建新式业务生产力应用程序

在本文中,我们将探讨 Visual Studio LightSwitch 中的一些新功能,这些功能可帮助您构建新式移动业务生产力应用程序. Visual Studio LightSwitch(以下简称 LightSwitch)旨在简化并缩短业务应用程序的开发过程.LightSwitch 应用程序可使用多种数据源.提供业务和授权逻辑以及创建可在多种设备上运行的客户端,而所有这些都不需要编写管道代码. LightSwitch 可聚合多种数据源,并且它自动公开一组开放数据服务(开放数据协议,简称 OD

如何在Access2007表中同时显示明细、小计、总计

问题描述: 如何在Access2007 表中同时显示明细.小计.总计? ID fullname pay 2 a ¥500.00 4 a ¥600.00 5 a ¥700.00 6 b ¥800.00 7 b ¥55.00 有以上格式的表格,要根据 FULLNAME 做小计,然后全部的做总计,变成以下格式 fullname pay a ¥700.00 a ¥600.00 a ¥500.00 a 小计 ¥1,800.00 b ¥55.00 b ¥800.00 b 小计 ¥855.00 总计 ¥2,6

《R语言数据分析》——导读

前 言 自20多年前发源于学术界以来,R语言已经成为统计分析的通用语言,活跃于众多产业领域.目前,越来越多的商业项目开始使用R,兼之R用户开发了数以千计易于上手的开发包,都使得R成为数据分析工程师及科学家最常用的工具. 本书将帮助读者熟悉R语言这一开源生态系统,并介绍一些基本的统计背景知识,以及一小部分相关的数学知识.我们将着重探讨使用R语言解决实际的问题. 由于数据科学家在数据的采集.清洗及重构上将耗费大量时间,因此本书首先将通过第一手实例来重点探讨从文件.数据库以及在线资源中导入数据的方法,

变换-fftw使用的问题 频域抽取失败 高手请进~

问题描述 fftw使用的问题 频域抽取失败 高手请进~ int FFTw_IFFTw_Fun2(IN dDataArray* pRRIData, IN float fmin, IN float fmax, OUT dDataArray& VLFData) { try { int nSamples = pRRIData->m_nSamples; int N = pRRIData->m_nLen; int Nout = floor(N/2)+1;//实数据的DFT具有 Hermitian对

以色列安全公司Radware这样做云安全

本文讲的是以色列安全公司Radware这样做云安全,这是一家年收入2.5亿美元的以色列安全公司,整体安全和业务应用安全解决方案是它的强项,全球拥有1000多名员工和30个分支机构.现在,它来到中国,发出云安全的声音. 上周,Radware安全解决方案副总裁 Carl Herberger 在京发布2016年七大预测,并接受媒体采访,安全牛记者到场,现将亮点内容整理如下: Carl W. Herberger,Radware安全解决方案副总裁,负责开发.管理并改善公司的安全产品与解决方案.Herber