Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Rad Studio 10.2.3 DataSnapServer / 6 сообщений из 6, страница 1 из 1
29.03.2019, 16:27
    #39793745
Mediv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rad Studio 10.2.3 DataSnapServer
Всем привет.
Есть сервер приложений (DataSnapServer) в котором описано n-ое кол-во методов и находятся все Query компоненты доступа к БД.
Клиентское приложение подключается с помощью TSQLConnection через TDSProviderConnection. В клиентском приложении работа построена на ClientDataSet-ах. В TDSProviderConnection есть поддержка интерфейса IAppServer и через него можно выполнить сохранение изменений в ClientDataSet-ах c помощью метода As_ApplyUpdates
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  IAppServer = interface(IDispatch)
    ['{1AEFCC20-7A24-11D2-98B0-C69BEB4B5B6D}']
    function  AS_ApplyUpdates(const ProviderName: OleStr; Delta: OleVariant;
                              MaxErrors: Integer; out ErrorCount: Integer; var OwnerData: OleVariant): OleVariant; safecall;
    function  AS_GetRecords(const ProviderName: OleStr; Count: Integer; out RecsOut: Integer;
                            Options: Integer; const CommandText: OleStr;
                            var Params: OleVariant; var OwnerData: OleVariant): OleVariant; safecall;
    function  AS_DataRequest(const ProviderName: OleStr; Data: OleVariant): OleVariant; safecall;
    function  AS_GetProviderNames: OleVariant; safecall;
    function  AS_GetParams(const ProviderName: OleStr; var OwnerData: OleVariant): OleVariant; safecall;
    function  AS_RowRequest(const ProviderName: OleStr; Row: OleVariant; RequestType: Integer;
                            var OwnerData: OleVariant): OleVariant; safecall;
    procedure AS_Execute(const ProviderName: OleStr; const CommandText: OleStr;
                         var Params: OleVariant; var OwnerData: OleVariant); safecall;
  end;



Сохранение изменений в ClientDataSet-ах нужно перенести на сторону сервера приложений, т.е. нужно через метод как то передать или ссылку на TDSProviderConnection(через GetServer получу IAppServer) или на сам интерфейс.
Если указать IAppServer в качестве параметра в методе на сервере приложений, то на клиенту метод не сгенерируется, т.к. нет поддержки такого типа данных в DataSnapServer.
Пробовал передавать TDSProviderConnection в качестве параметра, метод на клиенте генерится, но не отрабатывает.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
// Вызов метода на клиенте
procedure TForm3.Button2Click(Sender: TObject);
var aClient: TDMClient;
begin
  SQLConnection1.Connected := True;
  aClient := TDMClient.Create(SQLConnection1.DBXConnection);
  try
    aClient.Test2(DSProviderConnection1);
  finally
    aClient.Free;
  end;
end;

// Сгенерированный метод с помощью TSQLConnection
function TDMClient.Test2(AConn: TDSProviderConnection): Boolean;
begin
  if FTest2Command = nil then
  begin
    FTest2Command := FDBXConnection.CreateCommand;
    FTest2Command.CommandType := TDBXCommandTypes.DSServerMethod;
    FTest2Command.Text := 'TDM.Test2';
    FTest2Command.Prepare;
  end;
  if not Assigned(AConn) then
    FTest2Command.Parameters[0].Value.SetNull
  else
  begin
    FMarshal := TDBXClientCommand(FTest2Command.Parameters[0].ConnectionHandler).GetJSONMarshaler;
    try
      FTest2Command.Parameters[0].Value.SetJSONValue(FMarshal.Marshal(AConn), True);                       // ОШИБКА !!!
      if FInstanceOwner then
        AConn.Free
    finally
      FreeAndNil(FMarshal)
    end
  end;
  FTest2Command.ExecuteUpdate;
  Result := FTest2Command.Parameters[1].Value.GetBoolean;
end;



Ошибка :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
---------------------------
Debugger Exception Notification
---------------------------
Project DSClient.exe raised exception class EConversionError with message 'Internal: Type tkPointer is not currently supported'.
---------------------------
Break   Continue   Help   
---------------------------



Подскажите решение, если оно есть.
Спасибо.
...
Рейтинг: 0 / 0
29.03.2019, 16:35
    #39793752
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rad Studio 10.2.3 DataSnapServer
MedivСохранение изменений в ClientDataSet-ах нужно перенести на сторону сервера приложенийчто бы это значило?
я datasnap никогда не юзал и возможно поэтому не пойму вопроса т.к. пользуюсь обычным мидасом и сохранение изменений в cds, привязанных к провайдерам аппсервера автоматически и происходит на этом сервере, в простейшем случае вызовом метода cds.ApplyUpdates. что вы пытаетесь сделать не пойму
...
Рейтинг: 0 / 0
29.03.2019, 16:42
    #39793757
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rad Studio 10.2.3 DataSnapServer
Передаваемые экземпляры классов должны быть DTO, а не тяжелые компоненты...
Он же сериализует поля в JSON при передаче... А в TDSProviderConnection по любому есть поля типа Pointer. А Pointer не является допустимым типом для DTO.
...
Рейтинг: 0 / 0
29.03.2019, 18:43
    #39793888
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rad Studio 10.2.3 DataSnapServer
Mediv,
тупиковая вещь - Datasnap
...
Рейтинг: 0 / 0
01.04.2019, 09:52
    #39794433
Mediv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rad Studio 10.2.3 DataSnapServer
X-Cite, Спасибо
...
Рейтинг: 0 / 0
01.04.2019, 16:11
    #39794676
Mediv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rad Studio 10.2.3 DataSnapServer
Если кому интересно, то реализация методов интерфейса IAppServer есть в юните Datasnap.DSProviderDataModuleAdapter, проблема решена, всем спасибо.

Код: pascal
1.
2.
3.
TDM = class(TDSServerModule)
....
Self.Providers[AProvider].ApplyUpdates(Delta, 0, ErrCount, OwnerData)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Rad Studio 10.2.3 DataSnapServer / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]