Delphi 如何访问唯一的TRemoteDataModule';我的应用服务器中的s实例

Delphi 如何访问唯一的TRemoteDataModule';我的应用服务器中的s实例,delphi,multi-tier,Delphi,Multi Tier,如何在运行时从另一个单元访问远程数据模块(RDM)的实例?(RDM是单实例)。当我创建一个普通数据模块子体时,Delphi会在同一个单元中为它创建一个变量(例如:MyDM:TMyDM),但当我创建RDM的子体时,没有变量 我试图将运行时在另一个单元中创建的TClientDataSet的提供程序设置为RDM中的TDataSetProvider,但找不到对RDM实例的引用 我也曾尝试在设计时这样做,但尽管在RDM中将同一单元中的TSQLQuery的connection属性设置为TSQLConnect

如何在运行时从另一个单元访问远程数据模块(RDM)的实例?(RDM是单实例)。当我创建一个普通数据模块子体时,Delphi会在同一个单元中为它创建一个变量(例如:MyDM:TMyDM),但当我创建RDM的子体时,没有变量

我试图将运行时在另一个单元中创建的TClientDataSet的提供程序设置为RDM中的TDataSetProvider,但找不到对RDM实例的引用


我也曾尝试在设计时这样做,但尽管在RDM中将同一单元中的TSQLQuery的connection属性设置为TSQLConnection没有问题,但我无法设置TClientDataSet的提供程序,因为TClientDataSet的提供程序列表中没有RDM中的提供程序。

我对
TRemoteDataModule
做了一些研究,了解到它专用于支持COM应用程序服务器

事实上,您的RDM没有变量是因为您不应该像普通DM那样访问它。应用服务器将实例化RDM以响应远程调用,就像任何COM应用程序一样。当不再存在对该RDM的引用时,它将被销毁

由于该对象的生命周期取决于客户端,而不是服务器,因此在服务器中引用它是非常危险的。你永远不知道它什么时候有效。此外,将存在多个实例,在给定时刻访问该对象的每个客户端都有一个实例

考虑到这一点,我认为非常有理由告诉您,在创建RDM以执行您打算执行的更正之后,不可能访问RDM

如果您确实需要将
TDatasetProvider
放在不同的单元中,那么我的最佳建议是让RDM在某种提供者轮询服务中查找该提供者。这样做将使您能够在每次实例化新RDM时以及仅在实例化RDM时找到所需的提供程序


在您的位置,我将向RDM的
OnCreate
事件添加一个处理程序,并在该处理程序中调用类似
TProviderPool.GetProvider
的方法。该方法将为我提供一个提供者,我将其名称分配给CD的
ProviderName
属性。

我对
TRemoteDataModule
进行了一些研究,了解到它专用于支持COM应用程序服务器

事实上,您的RDM没有变量是因为您不应该像普通DM那样访问它。应用服务器将实例化RDM以响应远程调用,就像任何COM应用程序一样。当不再存在对该RDM的引用时,它将被销毁

由于该对象的生命周期取决于客户端,而不是服务器,因此在服务器中引用它是非常危险的。你永远不知道它什么时候有效。此外,将存在多个实例,在给定时刻访问该对象的每个客户端都有一个实例

考虑到这一点,我认为非常有理由告诉您,在创建RDM以执行您打算执行的更正之后,不可能访问RDM

如果您确实需要将
TDatasetProvider
放在不同的单元中,那么我的最佳建议是让RDM在某种提供者轮询服务中查找该提供者。这样做将使您能够在每次实例化新RDM时以及仅在实例化RDM时找到所需的提供程序

在您的位置,我将向RDM的
OnCreate
事件添加一个处理程序,并在该处理程序中调用类似
TProviderPool.GetProvider
的方法。该方法将为我提供一个提供程序,我会将其名称分配给CD的
ProviderName
属性。

首先,您需要设置客户端数据集的属性,为其分配一个组件实例(该组件应放在远程数据模块上,因为您没有远程使用它)。当然,远程数据模块单元必须与客户端数据集一起位于单元的uses子句中

然后,您可以分配客户端数据集的属性。

首先,您需要设置客户端数据集的属性,为其分配一个组件实例(由于您没有远程使用该组件,因此应将其放置在远程数据模块上)。当然,远程数据模块单元必须与客户端数据集一起位于单元的uses子句中


然后您可以分配客户端数据集的属性。

这里似乎没有多少人(包括我)了解您真正想要的。我建议重新表述这个问题,并提供更多的背景知识来澄清这个问题。你知道我该如何重新表述这个问题吗?我想问题在于,你在设计时将提供程序设置为远程数据模块中的TClientDataset,但在运行时找不到该提供程序。这就是为什么您决定自己通过代码设置提供者。我说的对吗?没有。我再次编辑了这个问题,也许现在更清楚了。@Daniel:ProviderName只显示本地提供商的名称。如果你在不同的单位需要他们,你确实需要寻找他们,但不是你想要的方式。这里似乎没有多少人(包括我)理解你真正想要的。我建议重新表述这个问题,并提供更多的背景知识来澄清这个问题。你知道我该如何重新表述这个问题吗?我想问题在于,你在设计时将提供程序设置为远程数据模块中的TClientDataset,但在运行时找不到该提供程序。这就是为什么您决定自己通过代码设置提供者。我说的对吗?没有。我再次编辑了这个问题,也许现在更清楚了。@Daniel:ProviderName只显示本地提供商的名称。如果你在不同的单位需要它们,你确实需要寻找它们,但不是寻找方法