【问题标题】: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 分配给错误的数据集,这可能是错误的并且静默失败。