【问题标题】:Delphi 2009, MyDAC and relational databaseDelphi 2009、MyDAC 和关系数据库
【发布时间】:2009-05-24 15:26:02
【问题描述】:

关于在 Delphi 2009 和 MyDAC 中使用关系数据库概念,我有一个相当大的问题。

我有一个类似于以下的数据库结构:


项目

  • 身份证
  • 姓名

存储

  • 身份证
  • 姓名

存储项目

  • 身份证
  • item_id
  • storage_id
  • 地点

现在,当我有一个来自“项目”的活动数据集时,如何在例如 DBGrid 中显示所有关联的存储?

顺便说一句:最好不要在每个表中都使用“id”,而是更改它并使用例如“id_item”或“id_storage”之类的东西?

提前谢谢你:)

【问题讨论】:

    标签: mysql database delphi delphi-2009 mydac


    【解决方案1】:
    • 您使用 StorageItem 创建了一个
      多对多的关系。如果你
      只需要一对多(许多存储 与一项相关,但您
      不需要反之亦然),那么你 可能只是将另一个字段添加到 存储表 (item_id) 是 Items 表的外键。 然后你创建一个索引 存储表中的 item_id,以及 连接两个表
      主从关系。
    • 如果您确实需要多对多,那么您 可以使用 SQL 添加查询组件
      (选择 * from StorageItem where
      item_id := :current_storage_id),以及 current_storage_id 是您查询的
      参数。

    【讨论】:

      【解决方案2】:
      Select a.ID, b.Name, a.Place
      from StorageItem a
      inner join Storage b
      on (a.id = b.id)
      

      上面的查询将返回 StorageItem 表中的所有项目及其名称,现在如果您想过滤它以仅返回特定项目的项目添加 where 子句就像

      Select a.ID, b.Name, a.Place
      from StorageItem a
      inner join Storage b
      on (a.id = b.id)
      where a.item_id = 1 -- place the item id here
      

      您可以将 where 与参数一起使用,例如:

      MyQuery.Sql.Text := ' Select a.ID, b.Name, a.Place from StorageItem a
      + ' inner join Storage b on (a.id = b.id) '
      + ' where a.item_id = :ItemNo ';
      MyQuery.ParamByName('ItemNo').asInteger := 1;
      MyQuery.Open;
      

      并将上面的查询分配给 dbGrid

      您也可以使用 MasterSource 属性来建立关系而不使用“where”部分

      【讨论】:

        【解决方案3】:

        我个人对 MyDAC 并不熟悉,但大多数数据集组件都有某种方式来建立主从关系。检查您的数据集上是否有 MasterSource 属性,或以某种类似方式将详细数据集链接到主数据集。如果没有,您可以使用 TDatasetField 建立链接,并过滤嵌套数据集以仅显示正确的记录。

        对于 ID 列名称,最好为每个字段指定一个描述性名称,这样您就可以通过查看代码来判断您的链接是否正确。如果您将 id 列称为“id”,则它可以是任何 id 列,如果您开始传递对数据集的引用,这可能会让人感到困惑。但如果它每次都被称为item_id,(有时不是item_id,有时不是id_item)那么你总是知道你在看什么。它也使您更容易知道您的代码是正确的。显示“master.item_id = detail.item_id”的过滤器更容易阅读“master.id = detail.item_id”。例如,如果将 master 分配给错误的数据集,这可能是错误的并且静默失败。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多