DapaSnap简介

    技术2022-05-19  20

     

    一.DataSnap(一)

    DataSnap到了Delphi2010有了很大的变化,已经可以完全抛弃DCOM之类的东西了,在以前版本中建立一个DataSnap,需要使用DCOMConnection或者SockConnection来连接到服务器,而在Delphi2010中提供了一个新的连接组件:TDSProviderConnection,可以更方便地来连接服务器.

    先来学习一个简单的DataSnap:

    新建一个工程,在Delphi Project中选择DataSnap Server组,

    然后选择其中的DataSnap Server,

    点击确定,

    然后选择缺省设置即可.

    系统会生成一个工程框架.其实现在你什么代码都不用写,就已经建立好了一个DataSnap的服务器,那么这个服务器可以提供什么呢?

    它输出了一个类,这个类只有一个方法:

    function EchoString(Value: string): string;

    我们来测试一下这个服务器,

    建立一个普通的VCL From Application,

    然后在窗体中放入下面控件:

    一个TSQLConnection,设置其Driver为DataSnap,并且Connected置为True.

    因为在本机测试,所以其他参数都不需要更改.(当然,需要先运行刚才建立的服务另,要不然会报告错误)

    一个TSqlServerMethod,将其SQLConnection属性设为刚才的SQLConnection,

    然后在ServerMethodName属性中可以选择TServerMethods1.EchoString.

    这时你选择Params属性,会出现两个参数:Value和ReturnParameter,

    前者是方法EchoString传人的参数,后者是EchoString输出的值.

     OK,到这里一切都设定好了,我们一句代码都没有编写,太说不过去了,还是放个按钮,然后在里面写下这几句代码吧:

      SqlServerMethod1.ParamByName(‘Value’).AsString:=’Hello,Garfield !’; SqlServerMethod1.ExecuteMethod; ShowMessage(SqlServerMethod1.ParamByName(‘ReturnParameter’).AsString);

     运行一下客户端,可以看到一个对话框,里面显示信息:Hello,Garfield !

    二.DataSnap(二)

    我们来做个简单的数据库连接测试.

    在上个学习的基础上,我们打开Server的ServerMethodUnit1模块,在设计界面放上三个控件:

    SQLConnection1: TSQLConnection; SQLDataSet1: TSQLDataSet; DataSetProvider1: TDataSetProvider;

    注意:

    1、如果使用sa,如果没有密码的话会连接失败,需要建立一个带密码的用户或者将sa设置上密码.

    2、如果连接SQL Server时报告错误,可以尝试安装一下MS SQL Server 2008 Native Client,

    这个包同样可以应用在SQL Server 2000中.

    然后将SQLDataSet1的SQLConnection设置为SQLConnection1,并且在CommandText中输入命令,

    比如:select * from jobs (连接到pubs数据库),设置Active为True.

    最后一步,将DataSetProvider1的DataSet设置为SQLDataSet1.

    OK,我们的服务器就设计完成了,编译运行.

     接下来, 我们来做一个客户端.在以前的DataSnap版本中(D7中好像是这样,其他版本没有测试),

    像刚才我们设计的东西要放在Remote Data Modul中,

    在连接的时候要使用DCOMConnection或者SocketConnection,现在不用了.

    再打开我们上次设计的客户端程序,在窗体上放置几个数据处理控件,

    来吧,像一般的数据应用程序那样放入数据感知控件:

    DBGrid1: TDBGrid; ClientDataSet1: TClientDataSet; DataSource1: TDataSource;

    然后我们要放入其他连接远程应用要用到的控件:

    SQLConnection1: TSQLConnection; DSProviderConnection1: TDSProviderConnection;

    设置SQLConnection1的Driver为DataSnap,Connected为True(注意运行服务器),

    设置DSProviderConnection1的SQLConnection为SQLConnection1,

    注意,下面是很重要的一步,

    即在ServerClassName中输入TServerMethods1,不知道Delphi为什么没有自动取出,这里需要手工录入.

    再设置ClientDataSet1的RemoteServer为DSProviderConnection1,

    现在就可以在ProviderName中选择DataSetProvider1了,

    如果没有上面那一步,这里将没有列出.

    好了,设置ClientDataSet1的Active为True,

    设置DataSource1的DataSet为ClientDataSet1,

    设置DBGrid1的DataSource为DataSource1(这些活都太熟了吧?)

    我们已经可以在网格中看到取回的数据来了.

     那么,我们可以编辑这些数据并更新回服务器吗?

    让我们接着来.

    在窗体上放置一个按钮,然后在Click事件中写上一句代码:

      ClientDataSet1.ApplyUpdates(0);

     运行客户端,然后试着修改一下数据并点击按钮….

    你可能顺利的提交了数据,但如果你操作的表没有用到增长字段的话,

    如果有自动增长字段,比如你测试的时候也像我一样使用的是pubs数据库,然后操作的是jobs表…

    天啊,出现了错误?

    这是自动增长字段的问题,我们有两种解决方法:

    1.Server端我们使用ADO来处理,ADO在处理自动增长字段时还是比较方便的.

    2.如果比较喜欢使用dbExpress,我们需要像下面这样做个设定:

    回到服务器程序,选择我SQLDataSet,然后将所以字段都加进来,然后选择自动增长字段,

    在属性中进行如下设置:

    AutoGenerateValue设置为AutoInc;

    ProviderFlags属性设置为:[pfInWhere,pfInKey];

    OK,编译运行,再回到客户端测试一下吧.

     其实对于自动增长字段的处理,你直接不让它出现在结果集中也可以.自己多做做测试吧.

    好了,现在可以不用配置复杂的DCOM,不用运行ScktSrvr(因为DSTCPServerTransport1已代替了), 简单分发你的分布式应用系统吧!

     


    最新回复(0)