2014-01-02 2 views
2

Я создал сервер 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; 
+1

Вы получаете ту же ошибку на своем сервере datasnap, если используете TSdoQuery вместо TSqlQuery? Причина, о которой я прошу, заключается в том, что у меня есть сервер datasnap, который выполняет десятки хранимых процессов с использованием TAdoQueries и Sql, который практически идентичен вашему «exec ...», – MartynA

+0

Спасибо @MartynA - это сработало! Я просто изменил свое соединение и запрос на ADO, и все работает. Пожалуйста, добавьте это как ответ, и я приму это. – Brendan

+0

Спасибо и сделали ... – MartynA

ответ

1

Мой сервер DataSnap использует вызовы хранимых процедур практически идентичен вашему, но использует TAdoQueries вместо TSqlQueries и работает отлично, так что любые другие читатели с той же проблемой, следует, возможно, попробуйте заменить TAdoQueries.

+0

Да, с помощью TSQLConnection и TSQLQuery были решены все мои проблемы. – Brendan

 Смежные вопросы

  • Нет связанных вопросов^_^