zoukankan      html  css  js  c++  java
  • 多层数据库应用基于Delphi DataSnap方法调用的实现(一)返回数据集

    从Delphi 2009开始,DataSnap技术发生了很大的变化,并在Delphi 2010和Delphi XE的后续版本中得到了持续的改进。Delphi 2009之前的DataSnap,虽然也实现了对中间层的方法调用,但那是基于COM技术的,实现起来比较麻烦,而且最关键的,是不能直接返回数据集(TDataSet)。如今,基于JSON的DataSnap,已经脱离了COM的束缚,可以很方便地直接返回数据集。我们在开发多层的数据库应用时,就可以采用全新的方式来进行,即客户端的所有数据查询和更新,可以被分割成对中间层多个方法的调用来完成。这种方式带来的最直接效果,就是客户端在完成一个完整的业务操作过程中,客户端到中间层、中间层到数据库的两个连接都不需要被保持,中间层如果再配合对象池、连接池技术,就可以服务于更多数量的客户端,服务器的各种资源也能够得到最大化的利用。

     

       

        如上图所示,客户端的3个连续活动,完成一个完整的业务操作。整个业务操作,通过两次对中间层的方法调用来完成。两次方法调用中,DataSnap中间层提供方法调用服务的业务类实例可能是不一样的,这取决于类工厂(TDSServerClass)的LifeCycle属性。

     

    下面简单演示一个例子。
    1、中间层的实现:
    ...
    {$METHODINFO ON}
      TServerMethods1 = class(TDataModule)
        SQLConnection1: TSQLConnection;
        SQLDataSet1: TSQLDataSet;
      private
        { Private declarations }
      public
        { Public declarations }
        function EchoString(Value: string): string;
        function ReverseString(Value: string): string;
        function GetEmployeeFullName(EmployeeId: Integer): string;
        function GetEmployees: TDataSet;
      end;
    {$METHODINFO OFF}

    ...

     

    implementation
    ...
    function TServerMethods1.GetEmployeeFullName(EmployeeId: Integer): string;
    begin
      Result := 'Employee not found';

      with SQLDataSet1 do
      begin
        CommandText := 'SELECT FIRST_NAME||'' ''||LAST_NAME as FullName ' +
          'FROM Employees WHERE Employee_id = :EmployeeId';
        ParamByName('EmployeeId').AsInteger := EmployeeId;
        Open;
        if not eof then Result := FieldByName('FullName').AsString;
      end;
    end;

     

    function TServerMethods1.GetEmployees: TDataSet;
    begin
      with SQLDataSet1 do
      begin
        CommandText := 'SELECT * FROM Employees';
        Open;
      end;
      Result := SQLDataSet1;
    end;
    ...

     

    //我们可以发现,不管中间层实际将有多少个不同的数据集要返回,中间层都只需要两个控件,即
    //TSQLConnection和TSQLDataSet,通过在TSQLDataSet的CommandText属性中写入不同的SQL语句,就
    //可以返回不同的数据集。

     

     

    2、客户端的相关代码:
    ...
      TForm2 = class(TForm)
        SQLConnection1: TSQLConnection;
        Employees: TButton;
        SqlServerMethod1: TSqlServerMethod;
        DataSetProvider1: TDataSetProvider;
        ClientDataSet1: TClientDataSet;
        procedure EmployeesClick(Sender: TObject);
      private
      public
      end;
    ...


    //要取得来自于中间层的数据集,使用以上几个控件,它们之间进行关联:
    //TClientDataSet-->TDataSetProvider-->TSqlServerMethod-->TSQLConnection-->中间层

     

    implementation
    ...

    //获取数据集
    procedure TForm2.EmployeesClick(Sender: TObject);
    begin
      with SqlServerMethod1 do
      begin
        ServerMethodName := 'TServerMethods1.GetEmployees';
      end;
      ClientDataSet1.Open;
    end;
    ...

     

     

    而数据集的更新,也是通过调用中间层的方法来实现,但需要稍微增加点技巧。敬请等待续集。

  • 相关阅读:
    左孩子右兄弟的字典树
    UVA 1401 Remember the Word
    HDOJ 4770 Lights Against Dudely
    UvaLA 3938 "Ray, Pass me the dishes!"
    UVA
    Codeforces 215A A.Sereja and Coat Rack
    Codeforces 215B B.Sereja and Suffixes
    HDU 4788 Hard Disk Drive
    HDU 2095 find your present (2)
    图的连通性问题—学习笔记
  • 原文地址:https://www.cnblogs.com/s502/p/3173976.html
Copyright © 2011-2022 走看看