【问题标题】:SQL Server 2008 Master/Detail ( Using Delphi and ADOQuery )SQL Server 2008 Master/Detail(使用 Delphi 和 ADOQuery)
【发布时间】:2013-12-26 09:48:44
【问题描述】:

我有一个带有 2 个表的 SQL Server 2008 数据库:Master 和 Detail

主字段:ID 和 ... ;

详细字段:ID、MasterID 和 ... ;

我已经在 SQL Server 中设置了 Master 和 Detail 的关系

我希望当我在 Master DBGrid 中选择一条记录时,Detail Query 仅返回与所选 Master Record 相关的记录,而 Detail DBGrid 仅显示相关记录

我不想每次选择带有 SQL 代码(例如)之类的主记录时都重新查询详细信息 ADOQuery:

SELECT * FROM Detail WHERE MasterID = Master.ID

不使用 ADOTable (Master Source) 怎么办?

换句话说,我希望这种关系在 DB 层中!

【问题讨论】:

  • 据我所知,主从关系通常与TTable后代组件一起使用。你真的需要TADOQuery 而不是TADOTable,它有MasterSource 属性吗?
  • "我不想每次都重新查询 Detail ADOQuery ..." 为什么不呢?如果 Sql Server 是后端,那么您可能使用的任何其他类型的数据集无论如何都必须在后台执行此操作。
  • "换句话说,我希望这种关系在 DB 层中!"然后在服务器上设置一个以 MasterID 作为输入并返回详细记录的存储过程(或 table-UDF)。不过,您的 Delphi 应用程序仍然必须调用存储的过程/函数。

标签: sql-server-2008 delphi delphi-2010 master-detail tadoquery


【解决方案1】:

如果要扁平化主从关系,可以通过JOIN查询获取2张表的所有数据:

SELECT m.*, d.* FROM Master m INNER JOIN Detail d ON m.Id = d.MasterId 

【讨论】:

  • 一个视图比每次都要求服务器进行内部连接更好。
【解决方案2】:

您只需要像往常一样设置详细数据集并将 SQL 更改为参数化的。 SELECT * FROM details WHERE MasterID =: id

这样只会为每个主记录加载相应的详细信息,这将限制负载并使显示的数据更加真实。

【讨论】:

    【解决方案3】:

    您可以在明细表上使用 Tadoquery 的过滤器属性。

    将此代码添加到 AdoQueryMaster 的 AfterScroll 事件中;

    AdoQueryDetail.filter := 'Where MasterID = ' +inttostr(AdoQueryMaster.fieldbyname('ID').asinteger);
    AdoQueryDetail.filtered := true;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2011-08-30
      • 1970-01-01
      • 2021-11-11
      相关资源
      最近更新 更多