Dengan TFDQuery,TClientDataSet, dan TDataSetProvider yang dibuat secara dinamis, saya menemukan "Penyedia data atau paket data yang hilang" dengan kode ini:

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;

Perhatikan bahwa TDataSetProvider yang dibuat memiliki pemilik, berdasarkan jawaban ini:

Jika DatasetProvider tidak memiliki pemilik, ClientDataSet tidak dapat memperoleh referensi ke penyedia

Tapi saya masih mendapatkan kesalahan. Membuka TFDQuery terlebih dahulu menunjukkan kepada saya bahwa ia memiliki data.

Apa yang bisa menjadi alasan?

Menggunakan FireDAC dengan Delphi 10.4. Sydney di aplikasi Win32.

0
Jan Doggen 5 November 2020, 11:20

1 menjawab

Jawaban Terbaik

Ternyata TClientDataSet membutuhkan pemilik juga:

lCDS := TClientDataSet.Create(Application);

Ini jelas dari kode yang memicu pengecualian:

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) gagal, sehingga kode tidak repot mencari TDataSetProvider

1
Jan Doggen 5 November 2020, 08:20