我已经创建了一个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;
答案 0 :(得分:1)
我的datasnap服务器使用的存储过程调用几乎与您的相同但使用TAdoQueries而不是TSqlQueries并且工作正常,因此任何其他具有相同问题的读者都应该尝试替换TAdoQueries。
答案 1 :(得分:-1)
尝试使用SQLStoredProc组件似乎工作正常..查找此材料。
View source for Creating the Server Side with DataSnap Server