首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重访: TClientDataset“丢失数据提供程序或数据包”

重访: TClientDataset“丢失数据提供程序或数据包”
EN

Stack Overflow用户
提问于 2020-11-05 08:20:13
回答 1查看 680关注 0票数 0

使用动态创建的TFDQueryTClientDataSetTDataSetProvider,我遇到了“丢失的数据提供程序或数据包”,其中包含以下代码:

代码语言:javascript
复制
procedure ResetSavedPasswords(ADataModuleDataBaseAdmin : TDataModuleDataBaseAdmin);
var
   lQuery     : TFDQuery;
   lCDS       : TClientDataSet;
   lProvider  : TDataSetProvider;
begin
   lFrmBezig := TFormBezig.Create(nil);
   lQuery    := TFDQuery.Create(nil);
   lProvider := TDataSetProvider.Create(Application); 
   lCDS      := TClientDataSet.Create(nil);
   try
      lQuery.Connection := ADataModuleDataBaseAdmin.FDConnectionTimeTell;
      lQuery.CachedUpdates := true;
      lProvider.Options := lProvider.Options - [poUseQuoteChar];
      lProvider.DataSet := lQuery;
      lProvider.Name    := 'prvResetSavedPW';
      lCDS.ProviderName := lProvider.Name;
      lQuery.SQL.Text   := Format('select %s,%s from <owner>%s',[sMedMedID,sMedSavedPassword,SMedTabelNaam]),ADataModuleDataBaseAdmin;
      lCDS.Open;

请注意,创建的TDataSetProvider有一个基于this answer的所有者

如果DatasetProvider没有所有者,则ClientDataSet无法获得对提供程序的引用。

但我还是明白错误。打开TFDQuery首先显示它有数据。

原因是什么?

使用FireDAC和Delphi10.4。悉尼在一款Win32应用程序中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-05 08:20:13

事实证明,TClientDataSet也需要一个所有者:

代码语言:javascript
复制
lCDS := TClientDataSet.Create(Application);

从触发异常的代码中可以明显看出这一点:

代码语言:javascript
复制
function TCustomClientDataSet.GetAppServer: IAppServer;
var
  ProvComp: TComponent;
  DS: TObject;
begin
  if not HasAppServer then
  begin
    if ProviderName <> '' then
      if Assigned(RemoteServer) then
        FAppServer := RemoteServer.GetServer
      else if Assigned(ConnectionBroker) then
        FAppServer := ConnectionBroker.GetServer
      else
      begin
        if Assigned(Owner) then
        begin
          ProvComp := Owner.FindComponent(ProviderName);
          if Assigned(ProvComp) and (ProvComp is TCustomProvider) then
          begin
            DS := GetObjectProperty(ProvComp, 'DataSet');
            if Assigned(DS) and (DS = Self) then
              DatabaseError(SNoCircularReference, Self);
            FAppServer := TLocalAppServer.Create(TCustomProvider(ProvComp));
          end;
        end;
      end;
    if not HasAppServer then
      DatabaseError(SNoDataProvider, Self);
  end;
  Result := FAppServer;
end;

Assigned(Owner)失败,因此代码不会费心查找TDataSetProvider

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64693497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档