在Delphi2009与MyDAC的关系数据库概念的使用方面,我有一个相当大的问题。
我有一个数据库结构,它看起来有点像下面的内容:
项目
存储
StorageItem
现在,当我拥有来自"Item“的活动数据集时,如何在例如DBGrid中显示所有相关的存储?
顺便问一句:不是在每个表中使用"id“更好,而是修改它并使用类似"id_item”或"id_storage“之类的东西吗?
(预先谢谢:)
发布于 2009-05-24 16:41:21
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“部分
发布于 2009-05-24 16:33:30
多到多的关系。如果你
只需要一对多(许多存储与一个项目相关,但您
反之亦然),那么您只需将另一个字段添加到存储表(item_id)中,这将是项表的外键。然后在存储表中创建item_id索引,并将两个表连接到
主细节relationship.
(从StorageItem中选择*
item_id := :current_storage_id),而current_storage_id是查询的
参数.
发布于 2009-05-24 16:30:38
我个人并不熟悉MyDAC,但是大多数dataset组件都有一些方法来建立主细节关系。检查数据集中是否有MasterSource属性,或将详细数据集链接到主数据集的类似方法。如果没有,则可以使用TDatasetField建立链接,并筛选嵌套数据集以仅显示正确的记录。
至于ID列名,为每个字段提供一个描述性名称是个好主意,因此您可以通过查看代码来判断您的链接是否正确。如果您调用id列" id ",则可能是任意id列,如果开始传递对数据集的引用,则可能会引起混淆。但是,如果每次都被称为item_id (有时不是item_id,有时是id_item ),那么您总是知道自己在看什么。这样就可以更容易地知道您的代码也是正确的。写着"master.item_id = detail.item_id“的过滤器更容易读懂"master.id = detail.item_id”。例如,如果将master分配给错误的数据集,则这可能是错误的,并且失败。
https://stackoverflow.com/questions/903993
复制相似问题