77范文网 - 专业文章范例文档资料分享平台

DataSnap基础(2)

来源:网络收集 时间:2020-06-05 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

DataSnap服务应用程序另一个优势是可将HTTP验证信息(所用协议和上下文信息)记录下来.以便于查找谁登陆过,谁试图登录(如做欺骗登录操作试图获取DataSnap服务的权限).

2.1.1.2. SERVERMETHODSUNITDEMO

注意我们已经检查了ServerContainerUnitDemo.pas单元,现在看一下DataSnap服务的另外重要的单元:ServerMethodsUnitDemo.pas单元.在新建DataSnap服务对话框中我们指定了

TDSServerModule类作为基类,因此TServerMethods1类型继承于TDSServerModule(其继承于

TDSServerModuleBase,又继承于TProvideDataModule,添加一个析构函数和BeforeDestruction过程. TProvideDataModule继承于正常的TDataModule,增加了服务提供者的能力 更多信息见后面).

由于TServerMethods1继承于TDataModule,设计时可以看到一个数据模块的可视区域.我们可以向其中添加一下不可视组件,如数据存取控件等.在第三节将操作数据库,现在保持设计区为空,仅向TServerMethods1类添加方法.

如果不想向项目组添加其他类型的项目—DataSnap控制台应用程序及DataSnap Windows服务应用程序,可跳到2.1.4节查看实现服务方法.

2.2. DATASNAP 客户端

第一个DataSnap服务端范例启动并侦听请求,现在创建一个客户端.本节中,我们将讲解如何在客户端连接服务端,如何导入方法生产服务类.

确信DataSnap服务已启动,我们创建一个DataSnap客户端应用程序项目.为了在设计时方便切换DataSnap服务项目和DataSnap客户端项目,将客户端项目添加到同一个项目组.任何类型的项目都可作为DataSnap客户端项目,这里我们选择VCL窗口应用程序,保存为DataSnapClient.dpr,主窗体为ClientForm.pas.控件栏中DataSnap服务目录中含有六个DataSnap(服务)组件,DataSnap客户端目录中不含我们现在需要的组件.

DataSnap客户端目录中的组件都是一些老的DataSnap组件,可以使用,但不推荐.但可使用新

的TDSProviderConnect组件,可以在新的DataSnap客户端上连接老的DataSnap服务(3.2中详述).

除了DataSnap客户端目录,我们还要看看dbEpress目录,可以找到一个新的组件叫做

TSQLServerMethod(注意:在下一个截图中这个新组件很容易发现,其用TSql前缀替代了TSQL前缀).

TSqlServerMethod组件可用于调用DataSnap服务的远程方法,但首先需要连接到DataSnap服务.可以使用TSQLConnect组件建立连接—--不在使用原来的TXXXConnection组件.为了灵活性,TSQLConnection组件的Drive属性下拉框中有个新选项:DataSnap.在ClientForm上放置一个TSQLConnection组件,设置其Driver属性为DataSnap.Driver属性将变成可展开的对象,展开后如下图:

注意:默认CommunicationProtocol属性为空,TSQLConnection将使用TCP/IP作为通信协议(端口211).BufferKBSize为32(KB),端口设置为211(与服务端设置相同).实际应用中一般将端口号设置为其他端口(同时修改服务端客户端),因为211端口是DataSnap默认端口不安全.

HostName,UserName和Password用于连接到DataSnap服务.在本地测试时,将HostName设置为localhost,通常可以设置为服务器名称,DNS或IP地址.

不要忘记将TSQLConnection的LoginPropt属性设置为False,否则将会在连接的时候弹出登录窗口.一旦TSQLConnection的Driver属性设置好,就可以设置Connected属性为True去连接DataSnap服务端.注意这时DataSnap服务必须运行才能连接成功.

2.2.1. DATASNAP客户端类

在确定连接正常后,右击TSQLConnection组件,选择Generate DataSnap Class选项,将生成一个

新单元,默认叫做Unit1,含有一个叫做TServerMethods1Client的类(在DataSnap服务方法类名称后加了一个Client).保存单元为ServerMethodsClient.pas.

这个TServerMethods1Client类如下所示 type

TServerMethods1Client = class private

FDBXConnection: TDBXConnection; FInstanceOwner: Boolean;

FEchoStringCommand: TDBXCommand; FServerTimeCommand: TDBXCommand; public

constructor Create(ADBXConnection: TDBXConnection); overload; constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload; destructor Destroy; override;

function EchoString(Value: string): string; function ServerTime: TDateTime; end;

如你所见,TServerMethods1Client类有两个构造方法,一个析构方法和两个我们在服务端定义 的服务方法.

为使用这些方法,将ServerMethodsClient单元引用到ClientForm,在客户端窗体上放置一个按钮,在按钮的OnClick事件中写如下代码:

procedure TForm2.Button1Click(Sender: TObject); var

Server: TServerMethods1Client; begin

Server := TServerMethods1Client.Create(SQLConnection1.DBXConnection); try

ShowMessage(DateTimeToStr(Server.ServerTime)) finally Server.Free end; end;

这个代码将创建一个TServerMethods1Client类实例,然后调用ServerTime服务类,最后释放这个DataSnap服务的代理对象.

点击按钮将弹出对话框显示服务端的时间. 同样方法测试EchoString.

2.2.1.1. HTTP COMMUNICATION PROTOCOL

注意我已经提到TSQLConnection组件以TCP/IP作为默认通讯协议.这样我们就看不到任何HTTP跟踪信息(在2.1.1.1.4小结中定义).然而,很容易修改通讯协议,仅需在TSQLConnection的Driver属性中的CommunicationProtocal子属性中输入HTTP即可.注意这是我们还要修改Port属性,因为211被TCP/IP占用,同时要修改服务端的TDSHTTPService组件的端口号.

修改后运行DataSnap客户端,会出现如下错误:

解决方法是在DataSnap客户端向ClientForm中添加DSHTTPLayer单元引用.

2.2.1.2. HTTP 验证

使用HTTP通讯协议的好处之一是可以使用其包含的HTTP验证.由DataSnap服务端的 TDSHTTPServiceAuthenticationManager组件所支持(详见2.1.1.1.5).

如果实现了OnHTTPAuthenticate事件处理,将会核对HTTP验证.我们必须保证输入正确的信息才能确保TDSHTTPServiceAuthenticationManager验证通过.否则将会得到一个HTTP/1.1 401未验证错误.

HTTP检验从客户端传递到服务端的用户名和密码,及其他TDSHTTPServiceAuthentication特定信息,我们需要在

DataSnap客户端的TSQLConnection控件中填写DSAuthUserDSAuthPassword属性.注意我们也需要指定HostName的值,除非是在同一台电脑上测试.

2.3. DATASNAP服务部署

范例的服务端和客户端在同一台电脑上运行良好,但是实际环境中,DataSnap服务将运行在服务器上,一或多台客户端通过网络连接服务端.服务端程序通常部署在没有安装Delphi的电脑上.这种情况下就需要考虑不用运行时包来编译DataSnap,而仅生成一个大的可执行文件.由于我们还没有使用任何数据操作组件,也不需要任何的其他数据库驱动或DLL文件.

2.3.1. DATASNAP 客户端部署

假设客户端与服务端运行在不同的电脑上,我们必须保证客户端可以连接到服务端.为了保证这点,客户端的TSQLConnection组件不能仅仅指定Driver属性中的CommunicationProtocol和端口,还需要指定HostName属性.设置IP地址或DNS.例如连接我的DataSnap服务的HostName属性为http://www.bobswart.nl/.(注意不需要指定http://前缀,因为在CommunicationProtocol属性中指定了通讯协议).

3. DATASNAP和数据库

除了使用Delphi2010 DataSnap框架创建简单的服务方法,我们还可以在服务端添加数据库操作,实现多层数据库应用—DataSnap服务连接到数据库,但DataSnap客户端是瘦客户端,不含任何数据库驱动.

我们同样可以快速创建数据库操作的DataSnap范例,只使用SQLConnection组件和已创建的客户端类.也可使用另外两个DataSnap组件TsqlServerMethod和TDSProviderConnection.

首先,我们要确保服务端公布了一个数据集,打开ServerMethodsUnitDemo并在数据模块中添加一个TSQLConnection组件.连接TSQLConnection组件到数据库和表(本例我连接到BlackFishSQL的Employees表).将TSQLConnection组件添加到数据模块的设计区域.设置Driver属性为BlachFishSql.然后设置Database属性为employee.jds文件的路径: C:\\Documents and Settings\\AllUsers\\Documents\\RAD Studio\\7.0\\Demos\\database\\databases\\BlackfishSQL on WindowsXP, or C:\\Users\\Public\\Documents\\ RAD Studio\\7.0\\Demos\\database\\databases\\BlackfishSQL.将TSQLConnection的LoginPrompt属性设置为False.设置Connected属性为True验证是否能正确连接.

下一步,添加一个TSQLDataSet组件,将其SQLConnection设置为TSQLConnection组件. 设置其CommandType为ctQuery,双击CommandText属性输入SQL语句.

SELECT EMP_NO, FIRST_NAME, LAST_NAME, HIRE_DATE, JOB_COUNTRY FROM EMPLOYEE 确保在设计时设置了TSQLConnection组件的LoginPrompt和Connected属性为False,及 TSQLDataSet的Active属性为False.

现在在ServerMethodsUnitDemo单元的TServerMethods1类中添加一个public方法返回一个 TSQLDataSet组件. type

TServerMethods1 = class(TDSServerModule) SQLConnection1: TSQLConnection; SQLDataSet1: TSQLDataSet; private

{ Private declarations } public

{ Public declarations }

function EchoString(Value: string): string; function ServerTime: TDateTime; function GetEmployees: TDataSet; end;

如你所见,TServerMethods1类中定义了一个叫做GetEmployees的方法,实现如下: function TServerMethods1.GetEmployees: TDataSet; begin

SQLDataSet1.Open; // make sure data can be retrieved Result := SQLDataSet1 end;

重新编译服务并运行.注意如你关闭了服务但无法重新编译,可能是DataSnap服务还在运行.

3.1. TSQLSERVERMETHOD

回到DataSnap客户端,TSQLConnection组件应该已经断开到DataSnap服务端的连接(如果仍然连接,说明你没有重新编译服务端).重新将Connected设置为True,从服务端更新信息,并重新从服务端生成客户端类(使用右键菜单).为了重写原来的ServerMethodsClient单元,推荐从项目中移除原来的ServerMethodsClient后在选择’Generate DataSnap Client Classes’方法.保存了新的单元文件后不需要修改客户端代码.生成了新文件后,可以从中看到GetEmplorees方法. type

TServerMethods1Client = class private

FDBXConnection: TDBXConnection; FInstanceOwner: Boolean;

FEchoStringCommand: TDBXCommand; FServerTimeCommand: TDBXCommand; FGetEmployeesCommand: TDBXCommand; public

constructor Create(ADBXConnection: TDBXConnection); overload; constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload; destructor Destroy; override;

function EchoString(Value: string): string; function ServerTime: TDateTime; function GetEmployees: TDataSet; end;

为使用GetEmployees方法获取TDataSet,我们可以使用TsqlServerMethod组件.将

TsqlServerMethod组件添加到客户端窗体,设置其SQLConnection属性为SQLConnection1,然后打开ServerMethodName下拉框显示可用的方法:一些DSAdmin方法(可通过设置TDSServer的HideDSAdmin属性为True禁止),接下来是三个DSMetaData方法,七个TServerMethods.As_XXX方法(由原来的IAppServer提供),和最后我们自己的TServerMethods1的方法:EchoString,ServerTime,和GetEmployees方法.

本例我们选择TServerMethods1.GetEmployees作为ServerMethodName属性的值.根据 ServerMethodName属性值,SqlServerMethod控件获取查询结果记录集.

我们使用TDataSetProvider,TClientDataSet和TDataSource来使数据显示在TDBGrid中.

在客户端添加一个TDataSetProvider控件,将其DataSet设置为SqlServerMethod控件.下一步添加一个TClientDataSet控件,将其ProviderName设置为DataSetProvider控件.设置其

RemoteServer属性为空—--这是用于原有DataSnap的方法,在新的DataSnap架构中不再使用.

最后,放一个TDataSource控件,设置其DataSet为TClientDataSet控件,然后就可以放TGBGrid和TDBNavigator控件了.设置其DataSource为TDataScource组件,将可以在客户端窗体中看到数据.为了在设计时验证连接,我们设置ClientDataSet的Active属性为True.将触发SqlServerMethod

的Active为True(开始检索数据,然后自动将Active设置为False),同时会将 TSQLConnection.Connected设置为True连接到服务端.

这种方式连接一直保持,TCliendtDataSet和TSQLConnection的被激活,数据显示在TDBGrid中.这种方式很容易以只读方式查看数据.注意这里说只读,因为TSQLServerMethod不允许

TDataSetProvide-TClientDataSet组合将客户端的数据变更传回服务端.

TSQLServerMethod是轻量级方式连接获取只读数据.这样,如果你需要获取DataSnap服务器上的数据但不需要做修改,当前这种发布一个返回TSQLDataSet结果集方法的架构就很好. 然而,有时我们需要更新数据,这时就必须使用不同的方法获取数据.

3.2. TDSPROVIDERCONNECTION

如果我们想提交更新,我们就需要TDSProviderConnection组件与服务端的TDataSetProvider关联,因此我们不但可以读取数据也可以修改数据.

首先,我们需要修改服务端数据模块,现有的只是返回一个TDataSet,我们必须添加一个实际的TDataSetProvider,确保将其从DataSnap服务端发布到客户端.所以,回到ServerMethodsUnitDemo单元放一个TDataSetProvider组件,设置其DataSet属性为TSQLDataSet.应该将TDataSetProvider重命名,如dspEmplyees; 现在,重新编译DataSnap服务,运行.然后修改客户端.

3.2.1. TDSPROVIDERCONNECTION 客户端

为检索到发布的TDataSetProvider组件需要修改一下DataSnap客户端.将TSQLServerMethod和TDataSetProvider组件从客户端窗体删除,添加一个TDSProviderConnection组件.设置其

SQLConnection属性为TSQLConnection组件,连接到DataSnap服务.我们也需要设置一个

ServerClassname属性值(很不幸不能选择只能输入).现在只能手动输入TDSServerModule的名字,这里是TServerMethods1.

在前一个例子中,TClientDataSet只设置了一个ProviderName属性.然而,使用

TDSProviderConnection组件,我们必须首先设置其RemoteServer属性为TDSproviderConnection组件,然后设置ProviderName属性(这个属性还为原来设置的DataSetProvider1,现在设置为dsEmployeer----在服务端发布的TDataSetProvider组件的名称).

在ProvideName属性的下拉框中显示dspEmployees选项(在服务端的ServerDataModule单元中发布的名称).

现在我们可以设置TClientDataSet.Active为True,在设计时查看数据.

设置TClientDataSet.Active为True,同时将TSQLConnection.Connected置为True.注意在设计

时最好不要将这两个属性设置为True.首先,如果你在IDE中打开DataSnap客户端项目,将会试图连接服务端,如果服务端没开启将失败.其次,如果在运行时启动应用程序,并且连接不可用,应用程序将会抛出异常.从而应用程序不能使用本地数据,导致远程连接无效将不能使用应用程序.

最好的方式是使用菜单选项或按钮明确的设置TSQLConnection组件连接,TClientDataSet组件进行获取数据.并提交包括username/password的信息,将在后面说明.现在确保

TClientDataSet.Active属性设置为False,同时TSQLConnection.Connected属性为False.在客户 端窗体中放一个按钮,在OnClick事件中明确的打开TClientDataSet. procedure TForm2.Button2Click(Sender: TObject); begin

ClientDataSet1.Open; end;

现在添加代码提交数据变更,保存回服务器. 3.2.2 数据库更新

有两种方法将数据修改保存会服务端:自动和手动.都是调用一下方法,但是会自动调用或手动 调用,各有优缺点.

对于自动方式,我们可以使用TClientDataSet的数据修改时触发的OnAfterInsert,OnAfterPost

和OnAfterDelete事件.在事件处理程序中,实现很简单,调用TClientDataSet的ApplyUpdates方法,发送变更,将Delta包发送到服务端保存回数据库.

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库DataSnap基础(2)在线全文阅读。

DataSnap基础(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/1091601.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: