我必须在一个更大的数据集中加入2个或更多数据集

时间:2017-01-27 16:26:03

标签: delphi

我正在使用delphi和 我想在一个更大的数据集中动态加入2个或更多数据集。我将在dbgrid中显示合并的结果。

什么是最好的解决方案?

提前谢谢

2 个答案:

答案 0 :(得分:2)

使用Sql Server,您可以在其TransactSQL中构造一个SQL查询,该查询使用JOIN构造将两个表“连接”在一起。例如,请参阅此前一个答案:SQL Server: Multiple table joins with a WHERE clause

您应该查看MSDN上的TransactSQL文档,例如

https://msdn.microsoft.com/en-us/library/zt8wzxy4.aspx

以下是从中检索作者及其标题的示例 sql Server的演示Pubs数据库:

use pubs
select
  a.au_id, 
  a.au_fname,
  a.au_lname,
  t.title
from
  authors a
  join titleauthor x on a.au_id = x.au_id
  join titles t on x.title_id = t.title_id
order by
  a.au_lname, a.au_fname

您可以使用New Query执行它以在SqlServer Management Studio中试用它,然后尝试将其粘贴到Delphi项目中的TAdoQuery中。

可视化JOIN结果的一种好方法是使用TBGrid。但是,如果要编辑一个或多个表的内容,则JOIN并不总是一件好事。例如,业务任务可能是编辑作者书籍的详细信息。要做到这一点,使用AdoQuerys通过在它们之间设置所谓的主 - 细节关系来连接应用中的作者和标题表比使用JOIN更方便。有很多方法可以做到这一点,也许你最好的方法是谷歌一个关于如何设置和使用它们的Delphi教程。

在SQL中,UNION构造是从两个单独的表中获取数据的另一种方法。

Btw Ado组件,例如TAdoQuery,可以很好地满足您的需求。如果你有一个Delphi版本,你也可以尝试一下,但如果你之前没有做过这类事情,那可能会有点令人生畏。

更新您已在评论中说过要从两台服务器获取数据 最终在一个数据集中结束而不使用Sql Server的“链接服务器”方法。

要做到这一点非常简单:它需要一些设置但合并 数据可以用两行代码完成。方法如下:

  1. 对于每个服务器,将以下内容放在表单/数据模块上:AdoConnection, AdoQuery,DataSetProvider和ClientDataSet。配置要连接的AdoConnection 其中一个服务器,将AdoQuery设置为使用AdoConnection,并设置DataSet属性 DataSetProvider到AdoQuery。设置的ProviderName属性 ClientDataSet到DataSetProvider。添加DataSource并将其DataSet属性设置为 ClientDataSet和连接到DataSource的DBGrid。给这些组件 名称A和B后缀。
  2. 使用Pubs数据库示例,将AdoQuery的SQL.Text属性设置为

      select
        [Source] = 'ServerA',  -- and ServerB for the other one of course
        *
      from
        authors
    
    1. 通过设置两个CDS的Active来检查两组组件是否正常工作 属性为True。在Form的FormCreate事件中,添加代码以打开两个CDS。

    2. 向表单添加第三个ClientDataSet,'cdsMergedData'并为其提供自己的 DataSource和DBGrid。将cdsMergedData的IndexFieldNames设置为'au_lname; au_fname'。

    3. 在表单上放置一个TButton'btnMerge'并将以下代码添加到其OnClick 事件 :

      cdsMergedData.Data:= cdsServerA.Data;

      cdsMergedData.AppendData(cdsServerB.Data,True);

    4. 就是这样。 True的{​​{1}}参数告诉AppendData 没有更多数据要加载。如果要从第三台服务器添加数据, 您可以将cdsMergedData设为FalsecdsServerB设为True

      没有无代码方式将cdsServerC中的数据更改反馈给 源服务器。您需要将更改复制到对应行 在相关的cdsMergedData CDS中,然后在其上调用cdsServer

答案 1 :(得分:1)

你可以试试这个: FIREDAC LOCALSQL

它就像一个魅力。但请注意

  1. 我不确定它是否适用于XE7。你必须检查它。在Seatle,它是可用的。
  2. 不能推荐用于大量数据。 3-4万条记录可能会变慢。
  3. 我知道一个错误。在制作SUM(FIELD)时,由于某种原因使用Group by sum来为字符串字段。