HTTP/1.1 401未验证 错误.
HTTP检验从客户端传递到服务端的用户名和密码,及其他TDSHTTPServiceAuthentication特定
信息,我们需要在DataSnap客户端的TSQLConnection控件中填写DSAuthUser和DSAuthPassword属 性.
注意我们也需要指定HostName的值,除非是在同一台电脑上测试. 2.3. DATASNAP服务部署
范例的服务端和客户端在同一台电脑上运行良好,但是实际环境中,DataSnap服务将运行在服务
器上,一或多台客户端通过网络连接服务端.服务端程序通常部署在没有安装Delphi的电脑上.这
种情况下就需要考虑不用运行时包来编译DataSnap,而仅生成一个大的可执行文件.由于我们还没
有使用任何数据操作组件,也不需要任何的其他数据库驱动或DLL文件. 2.3.1. DATASNAP 客户端部署
假设客户端与服务端运行在不同的电脑上,我们必须保证客户端可以连接到服务端.为了保证这
点,客户端的TSQLConnection组件不能仅仅指定Driver属性中的CommunicationProtocol和端口,
还需要指定HostName属性.设置IP地址或DNS.例如连接我的DataSnap服务的HostName属性
为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\\All
Users\\Documents\\RAD Studio\\7.0\\Demos\\database\\databases\\BlackfishSQL on Windows
XP, 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