使用存储过程通过DataSnap返回结果集

时间:2014-01-02 13:55:08

标签: delphi firemonkey delphi-xe5 datasnap

我已经创建了一个DataSnap服务器和一个客户端(FireMonkey XE5 - update 2),并且可以从DataSnap服务器(连接到SQL Server 2008)成功返回数据。但是,当使用存储过程时,我收到以下错误:

  

远程错误:[0x0005]:不支持操作。

这是我的 DATASNAP SERVER 功能:

注意使用“SELECT FROM”查询时,一切都很完美。一旦我用存储过程替换它,我收到一个错误。存储过程肯定存在,并且可以工作并返回数据。

function TServerMethods.GetUserDetails(UserID: integer) : TDataSet;
var ds : TSQLQuery;
begin
  //Ensure the SQL Connection is open - this works 100%
  if not SQLLocalTest.Connected then
    SQLLocalTest.Connected := true;

  ds := TSQLQuery.Create(self);
  try
    ds.SQLConnection := SQLLocalTest;
    //This produces the error when running the client  
    //The sp is valid and works 100%
    ds.SQL.Text := 'exec spMobileGetUserDetails ' + UserID.ToString();

    //If I replace the above with this, then it all works perfectly 
    ds.SQL.Text := 'SELECT FirstName, Surname, Email FROM Users WHERE UserID= ' + UserID.ToString();
    ds.Open;

    result := ds
  finally
  end;
end;

DataSnap客户端功能:

procedure TfrmTest.Button1Click(Sender: TObject);
var
  d : TClientDataSet;
  sm : TSqlServerMethod;
  dp : TDataSetProvider;
begin
  try
    sm := TSqlServerMethod.Create(Self);
    if not DS_VCL.Connected then
      DS_VCL.Connected := true;
    sm.SQLConnection := DS_VCL;

    sm.ServerMethodName := 'TServerMethods.GetUserDetails';
    sm.Params[0].AsInteger := 1;

    dp := TDataSetProvider.Create(Self);
    dp.Name := 'dspGetUserDetails';
    dp.DataSet := sm;

    d := TClientDataSet.Create(Self);
    d.ProviderName := 'dspGetUserDetails';
    d.Open;  //  <---- ERROR OCCURS HERE WHEN USING STORED PROC

    ShowMessage(d.Fields[0].ToString());
    d.Close;

    FreeAndNil(d);
    FreeAndNil(dp);
    FreeAndNil(sm);

  except on E: exception do
    ShowMessage(e.Message);
 end;
end;

2 个答案:

答案 0 :(得分:1)

我的datasnap服务器使用的存储过程调用几乎与您的相同但使用TAdoQueries而不是TSqlQueries并且工作正常,因此任何其他具有相同问题的读者都应该尝试替换TAdoQueries。

答案 1 :(得分:-1)

尝试使用SQLStoredProc组件似乎工作正常..查找此材料。

View source for Creating the Server Side with DataSnap Server