lyxcf
中级会员
 
UID 78421
精华
0
积分 309
帖子 205
金钱 309 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2006-8-16 来自 北京 角门北路
状态 离线
|
远程数据服务
RDS
RDS(Remote Data Services,远程数据服务)是允许我们处理客户端数据的一系列服务的统称。现在不用担心这方面的问题,因为RDS本身就是ADO的一部分,只有在需要传送和使用客户端数据时,才会使用。
远程数据服务RDS允许程序员开发原生的WINDOWS分布式多层应用系统,或是开发以浏览器为图形用户接口的WEB应用系统。
远程数据服务RDS提供了客户端应用程序在INTERNET/INTRANET或分布式环境中使用ADO中RECORDSET对象的能力。
可以在浏览器中通过远程数据服务RDS取得RECORDSET对象,然后在脚本语言中存取数据。或在原生WINDOWS应用程序中通过RDS取得RECORDSET对象,然后使用程序代码来存取远程数据源中的数据。RDS能够将ADO取得的数据一DCOM或HTTP通信协议由中介软件或中介组件传递给客户端,并且把数据缓存在客户端中让客户端存取数据。
远程数据服务RDS和ADO的关系:
程序<-->ADO<-->RDS<---->IIS/PWS<-->ODBC<-->数据库.
当我们在程序中试图使用ADO来存取WEB数据库时,由于ADO与ODBC分属于两台通过Internet连接起来的机器上,因此数据存取方式与ADO,ODBC同属于一台机器的情况大不相同,为了让程序也一样可以利用ADO存取WEB数据库,于是诞生了RDS,而RDS的角色就象是一位帮ADO存取WEB数据库的服务员一样,所以取名“远程端数据服务”
实际上RDS是由几个组件构成的。图10-1说明了这些组件以及它们之间是如何协同工作的。
组件似乎很多,但并不是所有的组件在每种情形下都被使用,实际上有一些不是RDS的一部分。然而这里还是把所有可能出现的组件都放在了图上,以备需要时查看。图10-1分成了两部分,因为使用客户端数据需要一些向客户端传送数据的方法,同时数据一旦到达客户端,也需要一些管理数据的方法。我们先从服务器端开始。
10.2.1 RDS服务器组件
虽然RDS用于传送和访问客户端数据,但其确实有一些基于服务器的组件。这是必需的,因为肯定需要某种方式将数据传送到客户端。因此有了一系列能访问数据并允许发送数据到客户端的服务器组件。我们把实际的数据传送称为调度(marshal)。
服务器端组件图的最上端是数据存储,由OLE DB提供者访问。它并不是RDS的一部分,但这表示只要有相应的OLE DB提供者,就可以通过RDS在客户端使用任何数据。至于如何处理服务器上的数据,可以有两种选择:
· 数据工厂(DataFactory)是缺省的用于访问数据存储的服务器端组件。它作为服务器端RDS组件的一部分安装在计算机上,除了能从数据存储中获取数据外,还为服务器处理发送到客户端以及从客户端发送来的数据。
· 自定义组件只是一个普通的提供了数据传送方法的COM组件。当数据工厂不能提供所需的功能时,可以使用自定义组件。本章将介绍一个简单的组件例子,在本书的后面还有一个更复杂的例子。
Web服务器使用这两种组件作为客户和服务器数据的接口。
10.2.2 RDS客户组件
在客户端先从底端的DataSpace对象开始,该对象作为客户端的一部分与数据工厂或自定义对象协同工作。DataSpace对象是一个代理对象,负责与服务器进行通信,同时也是数据传输的通道(或者通常所说的调度)。DataSpace对象是用客户端脚本语言或用HTML语言中的
TDC只读取表格中的数据或标记为表格形式的数据,例如,可以处理逗号分隔形式的数据(Comma Separated Value, CSV),类似于下面的数据:
"172-32-1176","White","Bob","408 496-7223"
"219-46-8915","Green","Marjorie","415 986-7020"
"238-95-7766","Carson","Cheryl","415 548-7723"
"267-41-2394","O'Leary","Michael","408 286-2428"
"274-80-9391","Straight","Dean","415 834-2919"
"341-22-1782","Smith","Meander","913 843-0462"
"409-56-7008","Bennet","Abraham","415 658-9932"
TDC也可以自由定义。除了DataURL外,TDC还有16个参数,可以通过设置OBJECT标记的参数项或编写脚本代码来配置这些参数。参数的说明如表10-1所示:
下面是使用参数创建TDC的一个例子。
也可以在客户端脚本中获取数据,下面的例子显示了给TDC加载数据的JScript脚本。
function fillTDC()
{
dsoAuthors.dataURL = 'authors.csv';
dsoAuthors.Reset();
}
如果改变了TDC的DataURL参数,必须使用Reset方法,这样才能使新的URL起作用。当介绍数据绑定时,会更详细地讨论如何使用它。Reset方法是TDC唯一的一个方法。
2. RDS数据控件
RDS数据控件能够访问一般的数据存储,而不是平面文件。它通常用于连接SQL数据库以从表、查询或存储过程获取数据。与TDC不同,RDS数据控件允许更新数据。在本章稍后通过示例说明如何进行数据更新。
类似于TDC,可以用HTML脚本中的OBJECT标记来创建一个RDS数据控件,并以类似的方式设置其属性。
RDS 教程
本教程讲述如何使用 RDS 编程模型对数据源进行查询和更新。首先说明的是完成此项任务的必要步骤,然后使用以 ADO for Windows Foundation Classes (ADO/WFC) 为特征的 Microsoft? Visual Basic? Scripting Edition 以及 Microsoft? Visual J++? 重复教程。
本教程使用了不同的语言代码,这基于以下两个原因:
假设 RDS 文档的读者使用 Visual Basic 编码。这样使得文档对 Visual Basic 编程人员十分方便,但对于使用其他语言的编程人员则没有多少用处。
如果您对特定的 RDS 功能不十分熟悉,但对于其他语言有所了解,那么可以通过在其他语言中寻求相同的功能来达到目的。
关于教程的说明方法
本教程基于 RDS 编程模型,对该模型的每一个步骤都进行了分别的讨论,并在每个步骤的讲述中使用了 Visual Basic 代码段。
使用其他语言重复代码范例的讨论较少。给定编程语言教程中的每个步骤,均以编程模型和描述性教程中的相应步骤加以注明。请使用步骤标号来参考在描述性教程中的有关讨论。
RDS 编程模型说明如下,在使用教程时可将其作为参考路线图。
RDS 对象编程模型
指定在服务器上调用的程序,并得到从客户端引用该程序的途径(代理)。
调用服务器程序,将参数传递给标识数据源和所发命令的服务器程序。
一般是通过使用 ADO,服务器程序从数据源获得 coRecordset 对象。可选择在服务器上处理 Rerdset 对象。
服务器程序将最终的 Recordset 对象返回客户端应用程序。
在客户端,可选择将 Recordset 对象置为易于可视控件使用的形式。
将 Recordset 对象的更改返回服务器并用于更新数据源。
步骤 1: 指定服务器程序(RDS 教程)
您所在的步骤...
指定在服务器上被调用的程序,并获得代理。
调用服务器程序,将参数传递给标识数据源和所发命令的服务器程序。
典型情况下,通过使用 ADO,服务器程序从数据源获得 Recordset 对象。
服务器程序将最终的 Recordset 对象返回客户端应用程序。
在客户端,可选择将 Recordset 对象置为易于可视控件使用的形式。
将对 Recordset 对象的更改返回服务器并用来更新数据源。
讨论
大多数情况下,使用 RDS.DataSpace 对象 CreateObject 方法来指定默认服务器程序、RDSServer.DataFactory 或自定义服务器程序(业务对象)。服务器程序在服务器上是实例化的,而返回的是对服务器程序的引用即代理。
本教程使用默认服务器程序:
Sub RDSTutorial1()
Dim DS as New RDS.DataSpace
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
...
步骤 2: 调用服务器程序(RDS 教程)
您所在的步骤...
指定在服务器上调用的程序,并获得代理。
调用服务器程序,将参数传递给表明数据源和所发命令的服务器程序。
典型情况下通过使用 ADO,服务器程序从数据源获得 Recordset 对象。
服务器程序将最终的 Recordset 对象返回客户端应用程序。
在客户端,可选择将 Recordset 对象设置为可视控件易于使用的形式。
将对 Recordset 对象的更改返回服务器,并用来更新数据源。
讨论
当调用客户端代理程序的方法时,服务器上的实际程序将执行该方法。在该步骤中,将在服务器上执行查询。
A 部分 在本教程中,如果不使用 RDSServer.DataFactory,那么执行该步骤最简便方法是使用 RDS.DataControl 对象。RDS.DataControl 将该步骤和上一步骤中的创建代理合并,用于发出查询。
设置 RDS.DataControl 对象 Server 属性以标识服务器程序被实例化的位置;设置 Connect 属性以指定访问数据源的连接字符串;设置 SQL 属性以指定查询命令文本。然后发出 Refresh 方法使服务器程序与数据源相连接,检索查询指定的行,并将 Recordset 对象返回客户端。
该教程不使用 RDS.DataControl,仅在这里给出它的形式:
Sub RDSTutorial2A()
Dim DC as New RDS.DataControl
DC.Server = "http://yourServer"
DC.Connect = "DSN=pubs"
DC.SQL = "SELECT * FROM authors"
DC.Refresh
...
本教程同样不使用 ADO 对象调 RDS,我们仍在这里给出它的形式:
Dim rs as New ADODB.Recordset
rs.Open "SELECT * FROM authors", "Provider=MS Remote;Data Source=pubs;Remote Server=http://YourServer"
B 部分 执行该步骤的一般方法是调用 RDSServer.DataFactory 对象的 Query 方法。该方法使用用于连接数据源的连接字符串,以及用于指定从数据源返回行的命令文本。
该教程使用 RDSServer.DataFactory Query 方法:
Sub RDSTutorial2B()
Dim DS as New RDS.DataSpace
Dim DF
Dim RS as ADODB.Recordset
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
Set RS = DF.Query ("DSN=pubs", "SELECT * FROM authors")
...
步骤 3: 服务器获得 Recordset(RDS 教程)
您所在的步骤...
指定在服务器上调用的程序,并获得代理。
调用服务器程序,将参数传递给标识数据源和所发命令的服务器程序。
典型情况下通过使用 ADO,服务器程序从数据源获得 Recordset 对象。
服务器程序将最终的 Recordset 对象返回客户端应用程序。
在客户端,可选择将 Recordset 对象设置为可视控件易于使用的形式。
将对 Recordset 对象的更改返回服务器,并用来更新数据源。
讨论
服务器程序使用连接字符串和命令文本在数据源查询所需的行。尽管也可以使用其他 Microsoft 数据访问接口如 OLE DB 等,但一般使用 ADO 检索该 Recordset。有关执行查询操作的详细信息,请参阅 ADO 教程。
自定义服务器程序可参照如下:
Public Function ServerProgram(conn as String, qry as String) as Object
Dim rs as New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open cn, qry, adOpenUnspecified, adLockUnspecified, _
adCmdUnspecified
Set ServerProgram = rs
End Function
步骤 4: 服务器返回 Recordset(RDS 教程)
您所在的步骤...
指定在服务器上调用的程序,并获得代理。
调用服务器程序,将参数传递给表明数据源和所发命令的服务器程序。
典型情况下通过使用 ADO,服务器程序从数据源获得 Recordset 对象。
服务器程序将最终的 Recordset 对象返回客户端应用程序。
在客户端,可选择将 Recordset 对象设置为可视控件易于使用的形式。
将对 Recordset 对象的更改返回服务器并用于数据源的更新。
讨论
RDS 将被检索的 Recordset 对象转换为可返回客户端的形式(即整理 Recordset)。实际的转换形式以及发送方法取决于服务器是否位于 Internet、Intranet 或局域网上,或者服务器是动态链接库。不过该细节并不是关键。总之,RDS 将 Recordset 返回到客户端。
在客户端,Recordset 对象被返回并赋给本地变量。
Sub RDSTutorial4()
Dim DS as New RDS.DataSpace
Dim RS as New ADODB.Recordset 'Optionally, ADOR.Recordset
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
Set RS = DF.Query("DSN=pubs", "SELECT * FROM authors")
...
步骤 5: 使用 DataControl(RDS 教程)
您所在的步骤...
指定在服务器上调用的程序,并获得代理。
调用服务器程序,将参数传递给表明数据源和所发命令的服务器程序。
较为典型的是通过使用 ADO,服务器程序从数据源获得 Recordset 对象。
服务器程序将最终的 Recordset 对象返回客户端应用程序。
在客户端,可选择将 Recordset 对象设置为可视控件易于使用的形式。
将对 Recordset 对象的更改返回服务器,并用来更新数据源。
讨论
返回的 Recordset 对象已经可以使用。可以对它进行同其他记录集一样的检查、定位或编辑。对记录集进行的操作取决于相应的环境。Microsoft Visual Basic 和 Visual C++ 都具有可直接地、或通过启用数据控件间接地使用 Recordset 的可视控件。
例如,如果正在使用 Microsoft? Internet Explorer 显示 Web 页,可能希望在可视控件中显示 Recordset 对象。Web 页上的可视控件无法直接访问 Recordset 对象。但是,可以通过 RDS.DataControl 访问 Recordset 对象(即绑定)。当 RDS.DataControl的 SourceRecordset 属性设置为 Recordset 对象时,RDS.DataControl 便可被可视控件使用。
使用可视控件对象须将其 DATASRC 参数设置为 RDS.DataControl,并将 DATAFLD 属性设置为 Recordset 对象字段(列)。
在本教程中,设置 SourceRecordset 属性。
Sub RDSTutorial5()
Dim DS as New RDS.DataSpace
Dim RS as New ADODB.Recordset '可选择 ADOR.Recordset
Dim DC as New RDS.DataControl
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
Set RS = DF.Query ("DSN=pubs", "SELECT * FROM authors")
DC.SourceRecordset = RS '可视控件现在可绑定到 DC。
...
步骤 6: 将更改返回服务器(RDS 教程)
您所在的步骤...
指定在服务器上调用的程序,并获得代理。
调用服务器程序,将参数传递给表明数据源和所发命令的服务器程序。
较为典型的是通过使用 ADO,服务器程序从数据源获得 Recordset 对象。
服务器程序将最终的 Recordset 对象返回客户端应用程序。
在客户端,可选择将 Recordset 对象置为易于可视控件使用的形式。
将对 Recordset 对象的更改返回服务器并用来更新数据源。
讨论
如果对 Recordset 对象进行编辑,任何更改(即对行的增加、修改或删除)都可以返回服务器。
注意 TRDS 的默认行为可通过 ADO 对象和 Microsoft OLE DB Remoting Provider 隐式调用。查询可返回记录集,而被编辑的记录集则可更新数据源。本教程不通过 ADO 对象调用 RDS,但在这里给出它的形式。
Dim rs as New ADODB.Recordset
rs.Open "SELECT * FROM authors", "Provider=MS Remote;Data Source=pubs;Remote Server=http://YourServer"
... '编辑记录集
rs.UpdateBatch '等值于 SubmitChanges
...
A 部分 假设在这里只使用了 RDS.DataControl 并且 Recordset 对象现在已与 RDS.DataControl 关联。如果 Server and Connect 属性已设置,SubmitChanges 方法将把对 Recordset 对象的任何改动更新到数据源。
Sub RDSTutorial6A()
Dim DC as New RDS.DataControl
Dim RS as New ADODB.Recordset '可选择 ADOR.Recordset
DC.Server = "http://yourServer"
DC.Connect = "DSN=pubs"
DC.SQL = "SELECT * FROM authors"
DC.Refresh
...
Set RS = DC.Recordset
... '编辑 Recordset
...
DC.SubmitChanges
...
B 部分 另外,您也可以通过指定连接和 Recordset 对象,使用 RDSServer.DataFactory 对象更新服务器。
Sub RDSTutorial6B()
Dim DS as New RDS.DataSpace
Dim RS as New ADODB.Recordset '可选择 ADOR.Recordset
Dim DC as New RDS.DataControl
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
Set RS = DF.Query ("DSN=pubs", "SELECT * FROM authors")
DC.SourceRecordset = RS '可视控件现在可绑定到 DC.
... '编辑 Recordset
blnStatus = DF.SubmitChanges "DSN=pubs", RS
|
|