【问题标题】:Querying a TClientDataSet using a TADOQuery使用 TADOQuery 查询 TClientDataSet
【发布时间】:2009-12-07 11:15:04
【问题描述】:

我的问题很简单。我有一个通过 TDataSetProvider 链接到 TADOQuery 的 TClientDataSet。我可以将 TADOQuery 中的数据放入 TClientDataSet,但是如何将 TClientDataSet 中的数据取回 TADOQuery?

当我运行查询然后将 TClientDataSet 的 Active 属性设置为 True 时,数据会自动从 TADOQuery 传输到 TClientDataSet,但是如果我停用 TADOQuery 然后再次激活它,我如何从 TClientDataSet 取回数据?

我在多个数据库上运行相同的查询并使用 TClientDataSet 连接结果。这工作正常。我现在的问题是我需要将连接的结果集从 TClientDataSet 中返回到 TADOQuery 中,以便我可以使用 TADOQuery 的 SaveToFile 过程(出于兼容性原因)。我该怎么做?

【问题讨论】:

    标签: delphi ado tclientdataset


    【解决方案1】:

    我使用 dbExpress 时不使用 TADOQuery,但我认为需要使用相同的技术。将更改发布到 TClientDataSet 后,调用“ApplyUpdates (0)”,它将数据从客户端数据集传输到其提供者。

    【讨论】:

    • 不幸的是,这不起作用。我尝试调用 ApplyUpdates,它没有给我一个错误,但没有更新 TADOQuery(与更新前的记录相同)。我猜它只是在更新 DataSetProvider(在 ClientDataSet 和 ADOQuery 之间),所以我也尝试在上面调用 ApplyUpdates。这给了我一个错误(“缺少连接或连接字符串”)。然后我将 ADOQuery 的连接字符串设置为“Provider=MSDAOSP.1;Persist Security Info=False”并再次尝试,但又出现了另一个错误(“对象或提供程序无法执行请求的操作”)
    【解决方案2】:

    您始终可以将数据集写回临时表,然后查询它。哎哟!!

    【讨论】:

    • 其实这是个好主意。许多报告应用程序都这样做,这被认为是一种很好的方法。
    【解决方案3】:

    我刚刚完成调查。我的应用程序允许用户通过查询他们的数据库来生成报告。我可以让它工作,它对于小型结果集非常有效 - 但是,由于这是一个报告应用程序,完全有可能返回数十万条记录,使用 ClientDataSet 会产生大量性能问题。一旦您获得超过 50,000 条记录(考虑到客户群,这是合理的),处理开始呈指数级增长,因此现在基本上没有实际意义。

    【讨论】:

    • 你用 MidasSpeedFix 和 FastMM4 试过了吗? andy.jgknet.de/blog/?p=437 另外,如果您不需要将更改写回数据库,那么关闭 ChangeLog 可以显着提高性能。
    • 是的。试过了。除非我做错了什么,否则对处理时间没有太大影响。目前,TADOQuery 可以运行一个返回 450,000 条记录的查询,并在 4 分钟内将其保存到文件中。 TClientDataSet 处理进行了 30 多分钟,此时我不得不关闭测试应用程序。为了获得我需要的结果,我将保留现有的处理和解析 XML 文档 (ADOQuery.SaveToFile) 并手动连接数据。
    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 2013-04-18
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多