FDQuery CloneCursor выбрасывает нарушение прав доступа - PullRequest
0 голосов
/ 08 июня 2019

Мне нужно получить данные в FDQuery в пользовательском потоке. В FireDac есть образец. Он присваивает данные FDMemTable. Мне нужно то же самое, но назначение данных для данного FDQuery.

Он работает нормально, но когда я пытаюсь назначить его в Grid, он выдает исключение нарушения прав доступа. Я изучал документы FireDac, но каким-то образом CloneCursor работает нормально с FDMemTable, а с FDQuery - нет.

constructor TQueryThread.Create(SQLText: string; QueryName: TFDQuery);
begin
  inherited Create(True);
  FDConnection := TFDConnection.Create(nil);
  FDConnection.ConnectionDefName := 'IBConn';
  FDConnection.LoginPrompt := False;
  FDConnection.Open;
  FDQuery := TFDQuery.Create(nil);
  FDQuery.Connection := FDConnection;
  FDQuery.SQL.Text := SQLText;
  FDQuery.ResourceOptions.CmdExecMode := amBlocking;
  FFDQuery := QueryName;
end;
procedure TQueryThread.Execute;
begin
  FDQuery.Open;
  Synchronize(procedure
              begin
                FFDQuery.CloneCursor(FDQuery, True);
              end);
end;

Так что мне нужен один из двух вариантов:

  1. Передается в качестве параметра FDQuery (qryClients) должен делать эту работу (Open) в потоке. Но я не знаю, как передать его в процедуру Выполнить из параметра Конструктора.
  2. Некоторый запрос Temp (qryTempThread) должен выполнить работу, а затем скопировать данных в запрос параметров.

После этого Запрос должен быть присвоен Источнику данных, и это не приводит к ошибкам. Наконец, DataSource должен быть назначен Grid (в моем случае CustomersGrid.DataController.DataSource:=DataModel.dtsrcClients), и это вызывает нарушение прав доступа.

...