我正在使用delphi和 我想在一个更大的数据集中动态加入2个或更多数据集。我将在dbgrid中显示合并的结果。
什么是最好的解决方案?
提前谢谢
答案 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的“链接服务器”方法。
要做到这一点非常简单:它需要一些设置但合并 数据可以用两行代码完成。方法如下:
使用Pubs数据库示例,将AdoQuery的SQL.Text属性设置为
select
[Source] = 'ServerA', -- and ServerB for the other one of course
*
from
authors
通过设置两个CDS的Active来检查两组组件是否正常工作 属性为True。在Form的FormCreate事件中,添加代码以打开两个CDS。
向表单添加第三个ClientDataSet,'cdsMergedData'并为其提供自己的 DataSource和DBGrid。将cdsMergedData的IndexFieldNames设置为'au_lname; au_fname'。
在表单上放置一个TButton'btnMerge'并将以下代码添加到其OnClick 事件 :
cdsMergedData.Data:= cdsServerA.Data;
cdsMergedData.AppendData(cdsServerB.Data,True);
就是这样。 True
的{{1}}参数告诉AppendData
没有更多数据要加载。如果要从第三台服务器添加数据,
您可以将cdsMergedData
设为False
,cdsServerB
设为True
。
没有无代码方式将cdsServerC
中的数据更改反馈给
源服务器。您需要将更改复制到对应行
在相关的cdsMergedData
CDS中,然后在其上调用cdsServer
。
答案 1 :(得分:1)
你可以试试这个: FIREDAC LOCALSQL
它就像一个魅力。但请注意