delphi - 重温:TClientDataset“缺少数据提供者或数据包”
问题描述
使用动态创建TFDQuery
的 , TClientDataSet
,TDataSetProvider
我遇到了“缺少数据提供者或数据包”的代码:
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
有一个所有者,基于这个答案:
如果 DatasetProvider 没有所有者,则 ClientDataSet 无法获取对提供者的引用
但我仍然得到错误。打开第TFDQuery
一个显示它有数据。
可能是什么原因?
在 Delphi 10.4 中使用 FireDAC。悉尼在 Win32 应用程序中。
解决方案
事实证明,这也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
推荐阅读
- c++ - 使用来自不同头文件 C++ 和 CMake 的类和函数
- javascript - 自动完成功能不适用于 IE11 和 Safari 浏览器
- asp.net - 如何将框架 4.6.1 类库转换为核心 3.1?
- c# - 如何使用 C# 在 SQLite 中获取最后插入的 id?
- android - 收到错误 MockKException: no answer found for: Observer(#8).onChanged Android
- php - 在可排序网格行为中添加项目
- apache-spark - 具有 Pubsub-BigTable 性能问题的 Spark Streaming
- appkit - 在 macOS 11 Big Sur 中具有自定义视图的 NSMenuItem
- react-native - AsyncStorage.getItem 需要 500 毫秒
- git - Git diff 可以查看未修改的行吗?