运行时等效于为TClientDataSet和TSQLQuery分配本地数据....

SiB*_*rit 3 delphi tclientdataset tdbgrid

所述TSQLQuery类是单向的,因此对于它被用作用于数据绑定源的TDBGrid,一个的TClientdataSet需要之间要被链接TSQLQuery的TDataSource所述的TDBGrid绑定到.

我可以连接设为TSQLConnection,使TSQLQuery活跃在设计时,使用指定的参数,可以,然后我可以在CDS单击鼠标右键,选择"将本地数据..."选项,它从获取数据TSQLQuery,然后通过链接的TDataSource出现在TDBGrid中.

选择"分配本地数据..."和实际出现在网格中的数据之间的时间间隔很短,所以我正在寻找在运行时复制它的方法.

据说,我可以将CDS 的Data属性设置为源的Data,但TSQLQuery没有Data属性.有一篇关于使用提供者的帖子,但是

DataSetProvider1.DataSet := SQLQuery1;
ClientDataSet1.Data := DataSetProvider1.Data;
Run Code Online (Sandbox Code Playgroud)

抛出访问冲突,

我通过循环遍历TSQLQuery并将记录附加到TClientDataSet来实现数据副本,但这比"分配本地数据..."要慢得多.

[编辑1]

我需要的所有组件都在设计时连接,我可以使TSQLConnection处于活动状态,然后是TSQLQuery,然后TClientDataSetTDBGrid显示来自TSQLQuery中定义的参数化查询的数据.

的OnChange一个事件TComboBox,我需要使用不同的参数来刷新查询,并有网格显示相关的结果,所以我关闭TSQLQuery,改变ParamByName值,打开TSQLQuery,然后调用ClientDataSet1.Last突出网格中的最后一行.

这给了我一个"无法对封闭数据集执行此操作"错误,所以我使用

ClientDataSet1.Active := true;
Run Code Online (Sandbox Code Playgroud)

但是会引发"访问冲突".

我能找到的所有例子都是关于将组件放到表单上,将它们链接在一起,然后它们起作用.嗯,是的,他们这样做,但我需要在运行时更改代码中的属性,并且仍然可以使用它,它只是拒绝这样做.

这真的让我感到沮丧.

[编辑2]

所以我按照Embarcadero站点上的示例来构建VCL Forms dbExpress数据库应用程序,用我的数据库连接细节替换该示例使用的Interbase.

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Building_a_VCL_Forms_dbExpress_Database_Application

在设计器中,一切看起来都很好,并且网格显示了查询的结果,但是当我使用F9运行它时,我在TCustomClientDataSet.InternalCheck中抛出了"访问冲突" .

SiB*_*rit 5

事实证明这是一个已知的MIDAS.DLL版本问题,可以通过在表单的uses子句中包含MIDASLib来解决.不幸的是,Datasnap.DBClient代码仍在抛出访问冲突而不是正确的消息,特别是因为2013年报告了这个问题.