Мне нужно получить данные в 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;
Так что мне нужен один из двух вариантов:
- Передается в качестве параметра FDQuery (qryClients) должен делать эту работу (Open)
в потоке. Но я не знаю, как передать его в процедуру Выполнить
из параметра Конструктора.
- Некоторый запрос Temp (qryTempThread) должен выполнить работу, а затем скопировать
данных в запрос параметров.
После этого Запрос должен быть присвоен Источнику данных, и это не приводит к ошибкам. Наконец, DataSource должен быть назначен Grid (в моем случае CustomersGrid.DataController.DataSource:=DataModel.dtsrcClients
), и это вызывает нарушение прав доступа.