Delphi MIDAS编程.docx

上传人:b****6 文档编号:6285453 上传时间:2023-01-05 格式:DOCX 页数:21 大小:36.21KB
下载 相关 举报
Delphi MIDAS编程.docx_第1页
第1页 / 共21页
Delphi MIDAS编程.docx_第2页
第2页 / 共21页
Delphi MIDAS编程.docx_第3页
第3页 / 共21页
Delphi MIDAS编程.docx_第4页
第4页 / 共21页
Delphi MIDAS编程.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

Delphi MIDAS编程.docx

《Delphi MIDAS编程.docx》由会员分享,可在线阅读,更多相关《Delphi MIDAS编程.docx(21页珍藏版)》请在冰豆网上搜索。

Delphi MIDAS编程.docx

DelphiMIDAS编程

MIDAS编程

多层分布式应用服务(MultitieredDistributedApplicationServices,即MIDAS)套件是一套组件,使用这些组件可以很容易地建立多层的客户-服务器数据库应用程序。

这也是公司愿意为Delphi企业版支付数千美元的原因之一,而它确实物有所值。

如果您购买了个人版本的Delphi,那么必须再购买企业版才能得到MIDAS组件和相应的动态链接库(DLL)。

如果您使用的是标准版或专业版,那么本节中的例子将无法使用。

但您仍然可以阅读一下本节,来看一看Delphi企业版是否适合您。

对另一些人来说,本节将通过例子来演示如何使用MIDAS的一些核心功能。

通过示范如何利用一些核心控件来建立客户和服务器程序,对这些功能进行了演示;共有三个例子示范了这些控件:

一个动态查询程序,它使用DCOM连接到同一台计算机和远程机器上的服务器,另一个程序示范了出错情况下的恢复,还有一个公文包程序的例子。

请记住:

客户程序通常有图形用户界面,并且与用户进行交互。

而服务器是向客户程序提供服务的应用程序。

客户-服务器这个术语隐含着图形用户界面与数据库服务器。

n层、多层或三层这些术语,大体上也是同样的意思。

第一层是客户程序,中间层或第二层包含了商务规则的编码,通常是应用服务器,而最后一层是数据库服务器自身(参见图15.1)。

本章提供了一些例子程序进行示范,其中客户端是用Delphi实现的标准Windows可执行文件,而中间层则是MIDAS和用Delphi实现的进程外COM服务器——自动化服务器,此外还需要适当的数据库。

为避免创建难于理解的例子,本章中只使用了DBDEMO表和本地Interbase数据库。

请记住,任何数据库服务器,如SQLServer、Oracle或Sybase等,在客户程序和中间层的代码不进行改变或改动很少的情况即可使用。

图15.1基本的三层客户-服务器应用程序配置,分别使用了三台物理上独立的计算

机示范了每一层的不同作用。

所有的三层可以都位于同一台物理计算机上

15.1MIDAS组件概述

本节中讨论了通常可能用到的组件。

用于实现三层应用程序的MIDAS组件分为客户程序的组件和服务器程序的组件。

另外,可能还需要一些通常用于建立客户程序的其他组件。

注意:

这里并未提供对MIDAS组件的详尽描述。

MIDAS套件是非常广泛的,现在看来还没有专门讲述MIDAS的Delphi书籍。

MIDAS为开发者提供了客户程序与服务器程序之间的桥梁。

一旦创建了包含TRemoteDataModule对象的服务器程序,然后即可建立客户程序,就像是两层应用程序一样。

即,可以根据个人的喜好选择是否使用数据感知控件,而无论怎样都可以在客户程序中得到并使用相关的数据,就像是已经了解了有关数据库的知识一样。

由于中间层的服务器程序是新出现的部分,我们从用于建立应用服务器的组件开始。

15.1.1定义服务器应用程序

在两层的客户-服务器应用程序中,包括数据库服务器以及数据感知客户程序。

客户程序由程序员编写,而服务器则是数据库应用程序。

在三层系统中,客户与数据库层之间添加了应用服务器层。

本节示范了用于建立服务器程序的一些基本的组件。

注意:

请记住,在n层、三层和多层结构之间并无实际的区别。

对于我们的目的来说,它们是同样的;至于是否存在区别,则是一个有待确定的问题。

TRemoteDataModule

TRemoteDataModule是TDataModule的后代,其用法也大致相同。

在服务器程序中,可将远程数据模块作为所有非可视组件的容器使用。

TRemoteDataModule实现了IAppServer接口,只需向标准的应用程序中添加该类的对象,即可实现需要向客户程序提供的功能。

要创建MIDAS服务器,首先在Delphi中启动一个标准的应用程序工程。

从NewItems对话框的Multitier属性页中,向工程添加一个远程数据模块对象。

创建远程数据模块的向导过程如下所示(见图15.2),其中需要选定CoClass的名字、实例化方法以及线程模型。

提供了这些信息后,Delphi将创建类型库和新的远程数据模块子类,该子类由TRemoteDataModule子类化而来,并继承了所定义的CoClass接口。

MIDAS应用服务器是一个自动化服务器。

可以向接口添加一些功能,并在远程数据模块中进行实现(参见15.2节“对MIDAS服务器进行查询”,其中的例子实现了一个接口,返回服务器可以访问的所有表名)。

远程数据模块将实现UpdateRegistry方法,该方法负责在第一次运行程序时向WindowsNT注册服务器。

无须向远程数据模块添加额外的功能,但需要添加一些组件,至少包括一个TProvider和一个TDataSet组件。

添加TDatabase和TSession组件也很有用。

在Delphi专业版中引入了数据集、数据库和会话组件,它们与用于建立两层数据库应用程序的组件是相同的。

TProvider与MIDAS一同发布,包括TDataSetProvider和TXMLTransformProvider两种组件。

图15.2远程数据模块的向导过程将子类化TRemoteDataModule

并生成类型库,用作COM服务器的接口

扼要地重新叙述一下,一个MIDAS服务器程序包括一个TDataSet组件(如TTable或TQuery),一个TProvider组件(如TDataSetProvider组件),一个TDatabase组件和TSession组件。

下面我们简要地对这些组件重新回顾一下。

TDataSetProvider

TDataSetProvider由TBaseProvider子类化而来。

数据集提供者处于客户与服务器程序之间,它是客户数据集的中介。

提供者维护了一个对数据源数据集的引用以及Options特性,该特性描述了如何使用一个特定的数据集提供者。

要使用数据集提供者,需要将DataSet特性赋值为TNestedTable、TQuery、TTable或TStoredProcedure等类型的对象。

要使TClientDataSet类型的对象能够与数据集提供者通信,需要将Exported特性设置为True。

Options特性有14个可用的值。

例如,要使数据集提供者能够接收动态SQL语句,需要向Options集合添加poAllowCommandText值。

这项工作可以在设计时利用ObjectInspector完成。

对于TProviderOptions的完整的解释,可以看一下Delphi的帮助文档。

本章稍后建立例子程序时,我们将针对一些特定的设置进行讨论。

TDatabase

向远程数据模块添加一个TDatabase。

数据库组件引用了BDE(Borland数据库引擎)别名或物理上的数据库。

如果存在已定义的别名,可以将其赋值给TDatabase.AliasName特性。

Connected特性打开或关闭数据库。

DatabaseName特性指定与数据库关联的名字。

如果DatabaseName特性是已存在的BDE别名,则无须将该值赋予数据库组件的AliasName或DriverName特性。

要定义新的数据库别名,只需添加DatabaseName和DriverName特性值,将AliasName特性置为空即可。

TDatabase.Params特性类型为TStrings,用于定义一些形如name=value的参数对,以便传递给要连接的数据库。

TDatabase.SessionName特性是一个TSession组件的名字。

TSession

TSession组件用于管理数据库连接。

多线程的数据库应用程序是其主要用途之一。

将AutoSessionName设置为True,可以保证服务器的每个实例都具有惟一的会话名;在多个客户与多个TRemoteDataModule对象实例进行连接时,这是必需的(更多的信息请参见TClassInstance和TComponentFactory类)。

TDataSet

TDataSet是TTable、TQuery、TNestedTable和TStoredProcedure的祖先类。

对于TDataSetProvider类的DataSet特性来说,上面提到的每个数据集组件都是可用的数据源(关于数据访问组件的完整细节,请参见第13章)。

TDataSetProvider

TDataSetProvider是MIDAS客户与MIDAS服务器之间的桥梁。

客户由TDataSetProvider对象得到数据,而该对象则由TDataSet对象得到数据。

而客户使用TDataSetProvider对象对数据库进行更新。

要使TClientDataSet对象从MIDAS服务器得到数据,必需设置DataSet、Exported和ProviderName特性。

上面提到过,DataSet特性向TDataSetProvider对象提供数据库中的数据。

而只有在Exported特性的值是True的情况下,客户才能连接到数据集提供者,TClientDataSet.ProviderName特性的值需要设置为提供者的名字。

下面列出的特性值示范了在远程数据模块中四个关键组件的基本设置(请注意,在列表中使用了TTable,实际上也可使用其余的三种数据集组件)。

TDatabase.DatabaseName=DatabaseName

Tdatabase.SessionName=SessionName

Session.AutoSessionName=True

Tsession.SessionName=SessionName

TTable.DatabaseName=DatabaseName

TTable.SessionName=SessionName

TTable.TableName=TableName

TDataSetProvider.Table=TDataSet

TDataSetProvider.Exported=True

TDataSetProvider.Name=ProviderName

当TClientDataSet.Active特性设置为True时,数据库、数据集和会话将连接到所引用的数据集。

部署服务器

当服务器的实现和测试完成后,即可进行部署工作。

类似于InstallShieldExpress的安装程序用于自动化应用部署,它可用来部署MIDAS服务器。

在部署MIDAS服务器时,需要安装服务器程序、MIDAS.DLL和STDVCL40.DLL。

安装过程实际就是将这些文件复制到目标计算机,并根据文件类型进行注册。

注意:

您可能会推测STDVCL40.DLL将变成STDVCL60.DLL,以反映Delphi版本的变化。

在本书写作时(使用Delphi6Beta2),该文件的名字仍然是STDVCL40.DLL。

当您部署MIDAS应用程序时,应当意识到文件名可能会发生变化。

提示:

在WindowsNT和Windows2000中,Run对话框是通过单击Start|Run激活的。

要注册创建的MIDAS应用服务器,可以运行应用程序或使用/REGSERVER开关运行程序。

例如,给定服务器server.exe,在Run对话框中或DOS命令提示符下输入:

server.exe/regserver

接着是使用Run对话框来注册MIDAS.DLL和STDVCL40.DLL。

可以使用Windows自带的regsvr32.exe程序来注册这些支持MIDAS程序的DLL。

例如,假定这些DLL被复制或安装到c:

\winnt\system32目录。

然后使用:

regsvr32c:

\winnt\system32\MIDAS.Dll

即可为这些DLL在Windows注册表中添加相应的条目。

15.1.2定义客户程序

在三层的MIDAS系统和与两层的客户-服务器系统中,客户程序是非常相似的。

大部分基本的工作部件都是相同的,只有微小的变化。

首先,不再需要使用DataAccess属性页上的数据集组件来从数据库得到数据,而要使用TClientDataSet。

TClientDataSet是TDataSet的子类,通常与一些数据感知控件进行协作,例如TTable、TQuery以及其他数据集组件。

例如,可以像其他数据集组件一样调用Fields编辑器,并添加静态TField对象;你在第13章中学到的许多特性都可以在TClientDataSet中使用。

除了TClientDataSet之外,还可能需要使用TCustomConnection。

该组件提供了与MIDAS服务器之间的连接。

例如,可以使用TDCOMConnection连接到远程机器上的服务器。

表15.1列出了TCustomConnection组件,以及所支持的不同连接协议。

表15.1TCustomConnection组件支持多种连接协议

连接类型

需求及描述

TDComConnection

支持到远程机器的Microsoft的DCOM连接,远程机器必须安装DCOM

TSockConnection

到远程应用服务器的TCP/IP连接,远程机器必须运行scktsrvr.exe

TWebConnection

使用HTTP协议连接到远程应用服务器;客户机必须安装Wininet.dll。

服务器必须安装IIS4或更高版本,或Netscape企业版3.6或更高版本。

TWebConnection所连接的Web服务器必须安装Httpsrvr.dll(Httpsrvr.dll与Delphi一同发布)

TCorbaConnection

使用CORBA连接到应用服务器

至于客户程序的其余部分,我们在第13章中已经见到过。

举例来说,如果要使用数据感知控件,则需要TDataSource组件。

TDataSource组件的DataSet特性指向一个TClientDataSet类型的对象,而不是TTable或TQuery。

而你显然需要使用数据感知控件。

实际上客户程序彼此非常相似,以至于在15.3节“错误处理”中可以利用Delphi中的DatabaseForm向导来创建示例程序。

要将窗体转换为使用MIDAS服务器,只需利用向导把TTable替换为TClientDataSet,并向标准的数据感知窗体添加一个TDCOMConnection组件即可。

与服务器程序进行连接

客户程序需要用TCustomConnection组件连接到服务器程序。

表15.1列出了可用的连接组件,可以根据系统的部署情况进行选择。

如果系统部署在企业内部网或Internet上,可以使用TSocketConnection或TWebConnection。

如果系统部署在同一物理网络上,可以选择使用TDCOMConnection或TCorbaConnection。

注意:

要使服务器运行在远程计算机上并使用DCOM,需要在远程计算机上安装并注册服务器、MIDAS.DLL和STDVCL40.DLL。

每个TCustomConnection都实现了AppServer接口,这使得连接组件支持一致的接口而无须考虑所使用的连接协议。

例如,如果使用TDCOMConnection组件,需要提供ServerGUID或ServerName特性。

在定位服务器时,ServerGUID更为可靠。

如果TDCOMConnection.ComputerName特性是空的,则假定服务器与客户位于同一台计算机上。

添加远程机器名,则客户将在该计算机上运行服务器程序。

要在设计时或运行时连接到服务器,可以将Connected特性设置为True。

注意:

GUID,发音为goo-id,是一个全局惟一的标识符。

GUID可确保是字符与数字的惟一序列,它保证了COM对象在世界范围内是惟一标识的。

每种连接都有一些额外的特性,它们对于该协议是必须的。

TSocketConnection需要IP地址和主机名。

而TWebConnection则需要用户名和密码、URL(统一资源定位符)以及代理服务器名。

TCorbaConnection需要库ID、主机名和对象名,对象名即应用服务器名。

Corba不是Microsoft协议,因此并不使用ServerGUID。

TCorbaConnection.RepositoryID、TCorbaConnection.ObjectName和TCorbaConnection.HostName三个特性与TDComConnection.ServerGUID、TDComConnection.ServerName和TDComConnection.ComputerName三个特性的作用是相似的。

配置TClientDataSet对象

TClientDataSet对象代表了内存中的数据集。

而您则需要提供RemoteServer特性和ProviderName。

RemoteServer特性是一个TCustomConnection组件,类似于TDComConnection,而ProviderName是服务器程序中TDataSetProvider对象的名字。

一旦连接到服务器和提供者之后,TClientDataSet就可以像DataAccess属性页上的两层数据集组件一样使用了。

因为TClientDataSet组件的作用类似于静态或动态数据集的入口,所以,如果服务器将表组件与数据集提供者关联起来,那么客户端数据集支持与表相似的行为;如果服务器将查询组件与提供者关联,则客户端数据集支持查询行为。

将SQL语句赋值给TClientDataSet.CommandText特性,即可向服务器传递SQL语句。

如果服务器端要支持动态SQL,则TDataSetProvider必须设置poAllowCommandText选项,在15.2节“对MIDAS服务器进行查询”中可以看到。

添加数据源

如果在客户程序中使用与数据进行绑定的控件,那么除了连接和客户数据集组件以外,还需要TDataSource类型的对象。

可将客户数据集的值赋予TDataSource.DataSet特性。

我们在第13章中提到过,需要将数据源赋值给数据感知DataSource特性,以便与数据库建立连接。

如果不使用数据感知控件,则无需数据源。

创建用户界面

MIDAS套件的功能并不影响如何开发客户程序。

由于TClientDataSet和TConnection组件负责管理与服务器的关系,而TClientDataSet是由TDataSet子类而来,因此可以像使用TTable、TQuery或其他数据集一样使用TClientDataSet。

关于两层与三层的MIDAS客户之间的相似性,我们将在15.3节“错误处理”中提供了这方面的一个例子。

部署MIDAS客户

MIDAS客户程序需要在所有运行该程序的计算机上安装并注册MIDAS.DLL。

类似于服务器的部署,可以使用Windows自带的regsvr32.exe程序注册MIDAS.DLL。

假定系统目录为c:

\winnt\system32,将该DLL复制到system32目录,使用下列命令即可进行注册:

regsvr32c:

\winnt\system32\midas.dll。

15.2对MIDAS服务器进行查询

上一节涵盖了MIDAS套件的客户程序与服务器程序的一般性的例子。

服务器程序使用TRemoteDataModule、TDatabase、TSession、TDataSet和TProvider。

MIDAS套件自带了两种数据集提供者,分别是TDataSetProvider和TXMLTransformProvider。

在客户程序中,需要使用MIDAS的TConnection和TClientDataSet组件。

而关于MIDAS客户-服务器开发的其他方面,则与使用其他工具和技术的客户-服务器开发非常相似。

本节通过建立一个MIDAS动态SQL服务器程序示范了开发过程的各个方面。

客户连接到服务器,并得到可用表的列表。

客户向服务器传递关于可用表的有效的SQL语句,服务器执行查询,并向客户返回可用的结果集。

查询的例子使用了DCOM,这是个很好的机会,可以创建服务器并在远程计算机上进行测试。

该程序中使用了BDE别名DBDEMOS,如果希望使用其他数据库,只需替换服务器端的TDatabase.DatabaseName组件即可。

15.2.1服务器程序的实现

本例中的服务器程序可以列出数据库中的所有表名,并根据客户程序的请求返回这些名字。

而其他的所有事情都是通过组件完成的,看一下下面列出的代码就知道了。

unitUServerModule;

interface

uses

Windows,Messages,SysUtils,Classes,ComServ,ComObj,VCLCom,

DataBkr,

DBClient,Server_TLB,StdVcl,DBTables,DB,Provider,MConnect,

Variants;

type

TServerModule=class(TRemoteDataModule,IServerModule)

Provider:

TDataSetProvider;

Database1:

TDatabase;

Query1:

TQuery;

Session1:

TSession;

private

{Privatedeclarations}

protected

classprocedureUpdateRegistry(Register:

Boolean;

constClassID,ProgID:

string);override;

functionGetTableNames:

OleVariant;safecall;

public

{Publicdeclarations}

end;

var

ServerModule:

TServerModule;

implementation

{$R*.DFM}

classprocedureTServerModule.UpdateRegistry(Register:

Boolean;

constClassID,ProgID:

string);

begin

ifRegisterthen

begin

inheritedUpdateRegistry(Register,ClassID,ProgID);

EnableSocketTransport(ClassID);

EnableWebTransport(ClassID);

endelse

begin

DisableSocketTransport(ClassID);

DisableWebTransport(ClassID);

inheritedUpdateRegistry(Register,ClassID,ProgID);

end;

end;

functionTServerModule.GetTableNames:

OleVariant;

var

I:

Integer;

TableNames:

TStrings;

begin

TableNames:

=TStringList.Create;

try

Session1.GetTableNames(Database1.DatabaseName,'*.*',True,

False,TableNames);

result:

=VarArrayCreate([0,TableNames.Count-1],

varOleStr);

forI:

=0toT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 自我管理与提升

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1