Я создал сервер DataSnap вместе с клиентом (FireMonkey XE5 - обновление 2) и может успешно возвращать данные с сервера DataSnap (который подключается к SQL Server 2008). При использовании хранимой процедуры, хотя, я получаю следующее сообщение об ошибке:Использовать хранимую процедуру для возврата набора результатов с помощью DataSnap
Remote Error: [0x0005]: Operation not supported.
Вот мой 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;
Вы получаете ту же ошибку на своем сервере datasnap, если используете TSdoQuery вместо TSqlQuery? Причина, о которой я прошу, заключается в том, что у меня есть сервер datasnap, который выполняет десятки хранимых процессов с использованием TAdoQueries и Sql, который практически идентичен вашему «exec ...», – MartynA
Спасибо @MartynA - это сработало! Я просто изменил свое соединение и запрос на ADO, и все работает. Пожалуйста, добавьте это как ответ, и я приму это. – Brendan
Спасибо и сделали ... – MartynA