关于在 Delphi 2009 和 MyDAC 中使用关系数据库概念,我有一个相当大的问题。
我有一个看起来像下面这样的数据库结构:
物品
- ID
- 姓名
贮存
- ID
- 姓名
存储物品
- ID
- item_id
- storage_id
- 地方
现在,当我有一个来自“项目”的活动数据集时,如何在例如 DBGrid 中显示所有关联的存储?
顺便说一句:最好不要在每个表中使用“id”,而是更改它并使用例如“id_item”或“id_storage”之类的东西?
先感谢您 :)
关于在 Delphi 2009 和 MyDAC 中使用关系数据库概念,我有一个相当大的问题。
我有一个看起来像下面这样的数据库结构:
现在,当我有一个来自“项目”的活动数据集时,如何在例如 DBGrid 中显示所有关联的存储?
顺便说一句:最好不要在每个表中使用“id”,而是更改它并使用例如“id_item”或“id_storage”之类的东西?
先感谢您 :)
我个人对 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
例如,如果分配给错误的数据集,这可能是错误的并且静默失败。
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”部分