【问题标题】:Revisited: TClientDataset "Missing data provider or data packet"重温:TClientDataset“缺少数据提供者或数据包”
【发布时间】:2020-11-05 08:20:13
【问题描述】:

使用动态创建的TFDQueryTClientDataSetTDataSetProvider 我遇到了“缺少数据提供者或数据包”的代码:

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首先显示它有数据。

可能是什么原因?

在 Delphi 10.4 中使用 FireDAC。悉尼在 Win32 应用程序中。

【问题讨论】:

    标签: delphi firedac tclientdataset delphi-10.4-sydney


    【解决方案1】:

    原来TClientDataSet 也需要一个所有者:

    lCDS := TClientDataSet.Create(Application);
    

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 2018-10-16
      相关资源
      最近更新 更多