首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

DataSnap 获取 服务端 的数据 求赐教

2013-06-25 
DataSnap 获取 服务端 的数据 求指教本帖最后由 thumb0422 于 2013-05-09 20:03:44 编辑Serverfunction TS

DataSnap 获取 服务端 的数据 求指教
本帖最后由 thumb0422 于 2013-05-09 20:03:44 编辑 Server


function TServerMethods1.GetByTable(aTable: string): TClientDataSet;
begin
  FBCDS.Close;
  with FBQUERY do
  begin
    Close;
    sql.Clear;
    sql.Add('SELECT * FROM '+aTable+' WHERE 1=1 ');
    Open;
  end;
  FBCDS.Open;
  Result := FBCDS;
end;

在服务端使用的时候能获取到数据

var acds:TClientDataSet;
begin
  acds:=TClientDataSet.Create(nil);

  acds:=ServerMethods1.GetByTable('tm_user');
  DataSource1.DataSet:=acds;
  acds.Open;
end;


Client 用Generate datasnap client classess 生成的方法

function TServerMethods1Client.GetByTable(aTable: string): TClientDataSet;
begin
  if FGetByTableCommand = nil then
  begin
    FGetByTableCommand := FDBXConnection.CreateCommand;
    FGetByTableCommand.CommandType := TDBXCommandTypes.DSServerMethod;
    FGetByTableCommand.Text := 'TServerMethods1.GetByTable';
    FGetByTableCommand.Prepare;
  end;
  FGetByTableCommand.Parameters[0].Value.SetWideString(aTable);
  FGetByTableCommand.ExecuteUpdate;
  if not FGetByTableCommand.Parameters[1].Value.IsNull then
  begin
    FUnMarshal := TDBXClientCommand(FGetByTableCommand.Parameters[1].ConnectionHandler).GetJSONUnMarshaler;
    try
      Result := TClientDataSet(FUnMarshal.UnMarshal(FGetByTableCommand.Parameters[1].Value.GetJSONValue(True)));
      if FInstanceOwner then
        FGetByTableCommand.FreeOnExecute(Result);
    finally
      FreeAndNil(FUnMarshal)
    end
  end
  else
    Result := nil;
end;


但是 客户端调用的时候

var aServer:TServerMethods1Client;
    acds:TClientDataSet;
begin
  aServer:=TServerMethods1Client.Create(DM.ClientCON.DBXConnection);
  acds:=TClientDataSet.Create(nil);
  acds:=aServer.GetByTable('tm_user') ;
end;

提示错误信息如下:
---------------------------
Debugger Exception Notification
---------------------------
Project Client_HC.exe raised exception class TDBXError with message 'Remote error: Internal: Type tkPointer is not currently supported'.
---------------------------
Break   Continue   Help   
---------------------------

求指教


[解决办法]
不要直接传对象啊,传data就行了
function?TServerMethods1.GetByTable(const aTable:?string; var AData : OleVariant):boolean;
begin
  FBCDS.Close;
  with FBQUERY do
  begin
    Close;
    sql.Clear;
    sql.Add('SELECT * FROM '+aTable+' WHERE 1=1 ');
    Open;
  end;
  FBCDS.Open;
  AData := FBCDS.Data;
  Result := true;
end;

客户端
var
  acds:TClientDataSet;
  data : olevariant;
begin
  acds:=TClientDataSet.Create(self);
  if ServerMethods1.GetByTable('tm_user', data) then 
  begin 
    acds.data := data;
    DataSource1.DataSet:=acds;
  end;
end;

热点排行