• 多层数据库应用基于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;
    ...

     

     

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

  • 相关阅读:
    深度优先和广度优先
    ajax<转>
    display:inline-block后会有间隙
    css样式多了个分号
    回答
    return false作用
    824. Goat Latin
    7. Reverse Integer
    48. Rotate Image
    9. Palindrome Number
  • 原文地址:https://www.cnblogs.com/s502/p/3173976.html
Copyright © 2020-2023  润新知