【问题标题】:How to return a record in a DataSnap method如何在 DataSnap 方法中返回记录
【发布时间】:2009-11-30 22:34:21
【问题描述】:

我希望能够声明具有以下签名的 Data Snap 方法

type
  TLoginInfo = record
    Username: string;
    Password: string;
    LastLogged: DateTime;
  end;

function GetLoginInfo(const UserId: Integer): TLoginInfo;

当我尝试调用它时,它说 TLoginInfo 并不为人所知。

【问题讨论】:

  • 哪种类型的 Datasnap?基于 DCOM 的还是基于 dbExpress 的?

标签: delphi delphi-2010 datasnap


【解决方案1】:

如果您使用的是“新”Datasnap,请参见此处:

http://blogs.embarcadero.com/adrian/2009/08/19/json-types-for-server-methods-in-datasnap-2010/ https://blogs.embarcadero.com/json-types-for-server-methods-in-datasnap-2010/ http://www.danieleteti.it/?p=146

【讨论】:

    【解决方案2】:

    将记录存储到流中并将流传递给 DataSnap 方法

    //在服务器端

    function GetLoginInfo(const UserId: Integer): TStream;
    begin
      Result := TMemoryStream.Create;
      Result.Write( loginRec, SizeOf(TLoginInfo) )
      Result.Seek(0, TSeekOrigin.soBeginning);
    end;
    

    //在客户端

    procedure TfrmMain.getLogInto( sUser: string);
    var
      AStr : TStream;
      loginRec : TLoginInfo;
    begin
    //  cycleConnection;
    
      with TMethodsClient.Create( SQLConn.DBXConnection, False ) do begin
    
        AStr := GetLoginInfo( sUser );
        AStr.Read( loginRec, SizeOf(TLoginInfo) )
        Free;
      end;
    
      FreeAndNil(AStr);
    end;
    

    【讨论】:

    • @ldsandon:这与摆脱类型安全无关,它是解决该问题的有效解决方案。如果您有更好的解决方案,请务必发布。
    • 您必须正确编组/解组数据。如何取决于您使用哪种 Datasnap。最后一种口味,看我的回答。
    • @ldsandon:想解释一下为什么使用 JSON 是 更好/更合适 的解决方案吗?附言我是一名周末程序员,这有助于我了解更多信息 :)
    • 这就是“新”Datasnap 本身用来编组/解组数据并传输它们的方式。开箱即用,它知道如何编组标准类型 - 需要注册用户定义的类型。 DCOM 使用另一种方式,包括类型库和自定义编组代码。当然,您可以在二进制缓冲区中传输所有内容 - 但您会丢失许多检查。
    猜你喜欢
    • 2023-03-20
    • 2022-08-02
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2016-10-24
    相关资源
    最近更新 更多