Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Delphi 2009、MyDAC和关系数据库_Mysql_Database_Delphi_Delphi 2009_Mydac - Fatal编程技术网

Mysql Delphi 2009、MyDAC和关系数据库

Mysql Delphi 2009、MyDAC和关系数据库,mysql,database,delphi,delphi-2009,mydac,Mysql,Database,Delphi,Delphi 2009,Mydac,关于在Delphi2009和MyDAC中使用关系数据库概念,我有一个相当大的问题 我有一个数据库结构,它看起来有点像: 项目 身份证件 名称 存储 身份证件 名称 存储项 身份证件 项目编号 存储标识 位置 现在,当我有一个来自项的活动数据集时,如何在例如DBGrid中显示所有关联的存储 顺便问一下:不是在每个表中都使用id,而是修改它并使用id\u项或id\u存储之类的东西,这样会更好吗 提前感谢:我个人不熟悉MyDAC,但大多数数据集组件都有一些方法来建立主-细节关系。检查数据集上是否有Ma

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

我有一个数据库结构,它看起来有点像:

项目 身份证件 名称 存储 身份证件 名称 存储项 身份证件 项目编号 存储标识 位置 现在,当我有一个来自项的活动数据集时,如何在例如DBGrid中显示所有关联的存储

顺便问一下:不是在每个表中都使用id,而是修改它并使用id\u项或id\u存储之类的东西,这样会更好吗


提前感谢:

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

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

使用StorageItem,您创建了一个 多对多关系。如果你 只需要一到多个存储 与一个项目相关,但您 不需要,反之亦然,那么你 您可以只将另一个字段添加到 存储表项\u id将 必须是Items表的外键。 然后在上创建一个索引 存储表中的项目id,以及 将两个表连接在一起 掌握细节关系。 如果你确实需要多对多,那么你 可以使用SQL添加查询组件 从存储项中选择*,其中 项目标识:=:当前存储标识,以及 当前\u存储\u id是查询的 参数 上面的查询将返回StorageItem表中的所有项目及其名称,现在,如果您希望对其进行筛选以仅返回特定项目的项目,则可以使用add 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部件

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;