再探:TClientDataset“缺少数据提供者或数据包" [英] Revisited: TClientDataset "Missing data provider or data packet"

查看:97
本文介绍了再探:TClientDataset“缺少数据提供者或数据包"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

通过动态创建的 TFDQuery TClientDataSet TDataSetProvider ,我碰到了缺少数据提供者或数据包";使用以下代码:

With a dynamically created TFDQuery,TClientDataSet, and TDataSetProvider I bump into the "Missing data provider or data packet" with this code:

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 具有所有者.

Note that the created TDataSetProvider has an owner, based on this answer:

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

If DatasetProvider has no owner, ClientDataSet can not obtain a reference to the provider

但我仍然会收到错误消息.首先打开 TFDQuery ,向我显示它具有数据.

But I still get the error. Opening the TFDQuery first shows me it has data.

可能是什么原因?

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

Using FireDAC with Delphi 10.4. Sydney in a Win32 app.

推荐答案

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

It turns out that TClientDataSet needs an owner too:

lCDS := TClientDataSet.Create(Application);

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

This is obvious from the code that triggered the exception:

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

The Assigned(Owner) fails, so the code does not bother looking for the TDataSetProvider

这篇关于再探:TClientDataset“缺少数据提供者或数据包"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆