当前位置:文档之家› 在VB中利用DataShape技术构建层次记录集

在VB中利用DataShape技术构建层次记录集

在VB中利用DataShape技术构建层次记录集
在VB中利用DataShape技术构建层次记录集

一、引言

在开发数据库应用程序的过程中,经常会遇到以层次结构显示相关记录的情况。如显示公司组织结构中各个部门员工的分布,又比如显示所有客户在一段时期内的详细购货记录条目。一般,这些数据在数据库中都是以两张单独的数据表存在的,因此在把实际数据按要求呈现给用户前,首先需要建立这两张数据表之间的连接,而常规的方法都是使用SQL语句中的Join语法实现。在建立连接之后,再通过循环、递归等算法完成界面呈现。

表面上看,这样的实现方式确实满足了功能的要求,但是仔细分析后就会发现,这并不是一种有效的实现方式。第一,假设你希望获取的是一个客户购货清单,在使用Join语句后会发现返回的记录中包含了大量重复的客户名记录,在网络环境下,这些重复记录会增加大量的网络流量;第二,当你获得这些记录集后,还需要构造合理的算法呈现记录,如果算法不佳再加上显示的记录数量大,在客户端会造成一定的延时。因此我们需要对上述实现方式加以改进,而最佳的方法就是直接使用数据定型技术。

二、概述

数据定型(DataShape)技术是ADO内置的一项数据服务,其最大的

特点是可以在数据检索过程中直接生成清晰的层次结构,并以关联记录集(Recordset)的形式返回检索结果。由于层次结构的构造在检索过程中完成,因此返回的记录集中只包含了唯一的有效记录(如客户名称),加上该记录的关联信息直接以记录集的形式返回,在显示结果时只需要遍历记录集的记录即可完成结果的呈现。

三、使用数据定型技术

要在应用程序中使用数据定型(DataShape)技术,首先需要在数据连接字符串中增加一个属性。原先,我们在建立连接对象时构造的连接字符串的形式如下所示:

strConn = “Data Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWI ND.MDB”;

而使用数据定型(DataShape)技术的连接字符串的形式为:

strConn = “Provider = MSDataShape;Data Provider=Microsoft.Jet.OLED B.4.0;Data Source=NWIND.MDB”

从上述两个连接字符串可以看到,数据定型(DataShape)技术需要使用两个提供者,一个是服务提供者“MSDataShape”,用来执行数据

定型服务;第二个是数据提供者SQLOLEDB.1;用来完成常规的数据操作。为了有效区分两类数据提供者,在调用中分别采用了“Provider”属性和“Data Provider”属性加以区分,这也是ADO中建议的调用方式。

在设置了正确的数据连接字符串之后,下面就需要构造数据定型语句了。在ADO提供的数据定型(DataShape)技术中包含了三种不同的返回记录集形式:

关系型层次记录集:这种形式返回标准的父记录集及相关的子记录集;

参数型层次记录集:这种形式和关系型层次记录集类似,也是返回标准的父记录集和相关的子记录集,只是子记录集的检索只有在明确指定父记录后才执行。

汇总型层次记录集:这种形式的记录集除了返回匹配父记录的子记录集之外,在父记录集中还可以包括由汇总函数生成的数据(如合计的销售额)。

下面,就以关系型层次记录集为例,向大家说明如何在数据库应用程序利用数据定型(DataShape)技术实现层次记录集。

四、构建数据定型语句

要应用数据定型技术,仅仅声明连接字符串是不够的,还需要依照数据定型语法构建操作语句。

下面,我们先来看一个已经构建好的关系型层次记录集的数据定型语句:

“SHAPE {Select CustomerID, CustomerName from Customers} AS Cus tomers APPEND ({Select * from Orders} AS Orders RELATE ’Custome rID’ TO ’CustomerID’) AS Orders”

从上面的语句可以看到,数据定型语句和我们日常使用的SQL语法非常相似,这个示例中的数据定型语句由两部分组成,第一部分“SHAPE {Select CustomerID, CustomerName from Customers} AS Cus tomers APPEND ({Select * from Orders} AS Orders” 的大括号中分别以标准的SQL语句返回Customers表和Orders表的记录集,第二部分“RELATE’CustomerID’ TO ’CustomerID’”申明两个数据表之间的关联字段,并完成连接的建立。

这里特别需要说明几点:

AS关键字后面表示的是记录集的别名,尽管语法本身不要求必须提供别名,但是在实际使用过程中还是建议使用别名,尤其是最后一个AS关键字,如果需要访问子记录集,这个别名是关键的,否则必须获取系统自动生成的记录集名称,才能正确访问其中的记录。

用于建立两个数据表之间的关联字段必须同时包含在之前的查询语句中,即关联字段的名称可以不同,但是该字段必须出现在之前的SQL语句中,否则Shape语句将报错。

显然,与SQL语句相比,数据定型语句要复杂的多,一下子很难掌握编写的技巧。不过没有关系,VB6.0已经内置了一个很好的工具,可以帮助我们以图形化的方式轻松的创建所学数据定型语句,这就是Data Environment。

1、添加Data Environment

在VB6.0的IDE下,从“工程”菜单中,选择“添加 Data Environment”。如果“工程”菜单下没有出现“添加 Data Environment”菜单项,则在“工程”菜单中,单击“引用...”,然后从“引用...”对话框中,选择“Data Environment 1.0”,接着单击“确定”。

2、设置Connection对象

在数据环境设计器窗口下用鼠标右键单击“Connection1”,从右键快捷菜单中选择“属性”,之后在“数据链接属性”的“提供程序”标签下选择“Microsoft Jet 4.0 OLE DB Pr ovider”,接着切换到“连接”标签,在“选择或输入数据库名称”文本框内输入Northwind所在的路径“C:\Program Files\Microsoft Visual Studio\VB98\NWIND.MDB”,单击确定。

3、建立父命令对象

在Data Environment的工具栏上单击“添加命令”按钮,然后在新建的“Command1”对象上单击右键,选择“属性”,接着在“通用”标签下选中“SQL语句”,并输入“Select CustomerID, CustomerName from Customers”,单击“确定”;

4、建立子命令对象

再次在Data Environment的工具栏上单击“添加命令”按钮,然后在新建的“Command2”对象上单击右键,选择“属性”,接着在“通用”标签下选中“SQL语句”,并输入“Select * from Orders”,然后切换到“关联”标签,选中“与父命令对象相关联”,并在“父命令”下拉列表中选择

“Command1”,接着在“父字段”和“子字段/参数”两个下拉列表中选择“CustomerID”,单击“添加”,再单击“确定”。

5、浏览数据定型语句

到上一步为止,已经成功创建了一个标准的数据定型语句,接下来在“Command1”上单击鼠标右键,然后选择“层次结构信息”即可浏览生成的Shape语句。

本例生成的语句如下:

“SHAPE {Select CustomerID, CustomerName from Customers} AS Co mmand1 APPEND ({Select * from Orders} AS Command2 RELATE ’C ustomerID’ TO ’CustomerID’) AS Co mmand2”

至此,我们已经通过Data Environment成功创建了数据定型语句,只要将上面生成的数据定型语句复制到应用程序就可以使用了。

五、显示层次记录集

数据定型语句构建成功之后,接着就需要考虑如何呈现的问题了。通常的形式不外乎树型和表格两种,树型格式一般用来显示索引类的

数据,如部门与员工信息;而表格则多用来显示明细记录,如客户及购买记录。针对这两种情形,我们可以分别使用Treeview和MSHFlexGrid来实现。

(一)、用Treevew显示层次记录集

首先,在VB下单击“工程”、“部件”,然后在“部件”窗口的下拉列表中选中“Microsoft Windows Common Controls 6.0”,单击“确定”。接着将Treeview控件从工具箱拖到表单上,并输入以下代码:

Sub datashape()

Dim cnn As New ADODB.Connection

Dim rsCategory As New ADODB.Recordset

Dim rsProduct As New ADODB.Recordset

Dim ProductNode As Node

Dim CategoryNode As Node

cnn.Provider = "MSDataShape"

cnn.Open "Data Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\P rogram Files\Microsoft Visual Studio\VB98\NWIND.MDB"

TreeView1.Nodes.Add , , , "产品列表"

rsCategory.StayInSync = False

rsCategory.Open "SHAPE {SELECT CategoryID, CategoryName FRO M Categories} AS CmdCategory APPEND ({SELECT ProductID, Produ ctName, CategoryID FROM Products} AS CmdProduct RELATE ’Categ oryID’ TO ’CategoryID’) AS CmdProduct", cnn

While Not rsCategory.EOF

Set CategoryNode = TreeView1.Nodes.Add(1, tvwChild, "C" & rsC ategory("CategoryID"), rsCategory("CategoryName"))

Set rsProduct = rsCategory("CmdProduct").Value

While Not rsProduct.EOF

Set ProductNode = TreeView1.Nodes.Add(CategoryNode, tvwChi ld, "P" & rsProduct("ProductID"), rsProduct("ProductName"))

rsProduct.MoveNext

Wend

rsCategory.MoveNext

Wend

rsProduct.Close

Set rsProduct = Nothing

rsCategory.Close

Set rsCategory = Nothing

cnn.Close

Set cnn = Nothing

End Sub

(二)、用MSHFlexGrid显示层次记录集

与Treeview相比,MSHFlexGrid在显示层次记录集时更加的方便,由于MSHFlexGrid内置了显示层次记录集的功能,因此,我们只要按照之前介绍的在VB下建立一个Data Enviorment,然后将MSHFlexGrid的Datasource设置为该Data Enviorment就可以了。当然,我们也可以通过将ADO Data控件的RecordSource设置为Data Shape语句,然后将MSHFlexGrid的Data source设置为ADO Data控件,同样可以显示层次记录集。下面,就给出一段用ADO Data控件配合MSHFlexGrid显示层次记录集的示例:

首先,在VB下单击“工程”、“部件”,然后在“部件”窗口的下拉列表中选中“Microsoft Hierarchical FlexGrid Control 6.0”,单击“确定”。接着将MSHFlexGrid控件从工具箱拖到表单上,并输入以下代码:

Private Sub Form_Load()

With Adodc1

.ConnectionString = "Provider=MSDataShape;Data Provider=Micros oft.Jet.OLEDB.4.0;Data Source=C:\Program Files\Microsoft Visual Studi o\VB98\NWIND.MDB"

.RecordSource = " SHAPE {SELECT CustomerID, ContactName, Co mpanyName, Address, Phone FROM Customers} AS CmdCustomers AP PEND ({SELECT CustomerID, OrderID, OrderDate, ShipAddress, Ship City, ShipName, ShippedDate FROM Orders} AS CmdOrders RELATE ’CustomerID’ TO ’CustomerID’) AS CmdOrders"

End With

Set MSHFlexGrid1.DataSource = Adodc1

End Sub

六、小结

通过上面的介绍,相信大家已经体会到Datashape技术在显示层次记录集时的便利了。事实上,Datashape技术除了显示层次关系外,还可以在显示层次关系的同时计算合计值、平均值等常见的统计函

数,而且显示的层次也不受限制。所以,如果你需要在自己的应用程序中显示层次记录集,Datashape 技术一定会成为一项有力的武器。限于篇幅的缘故,本文仅仅介绍了Datashape技术的基本使用,大家可以通过阅读ADO SDK文档进一步获取相关的知识,当然也欢迎大家来信和我交流。

相关主题
文本预览
相关文档 最新文档