【问题标题】:AutoID Field in Many-to-Many, Insert Using TDataSet / Query (Delphi / MSAccess)多对多中的 AutoID 字段,使用 TDataSet / Query (Delphi / MSAccess) 插入
【发布时间】:2012-01-06 16:20:01
【问题描述】:

我有一个“项目”数据库,它被分配到多个“类别”。类别可以有多个项目,反之亦然。数据库结构的相关部分如下:

[tblItem]
项目 ID(自动编号)
正文(正文)

[tblCategory]
类别 ID(自动编号)
名称(文字)

[tblItemCategory]
ItemID(长整数)
CategoryID(长整数)

我想构建一个面板组件,它在顶部显示一个类别名称,下面是属于该网格的项目的数据绑定网格。这个面板组件会有很多实例,最终用户应该能够创建一个新项目,并同时从其中的任何一个中将其分配给相关类别。

在 MS Access 中,可以创建一个嵌套表单,其中“子”一个数据绑定到一个查询,该查询是“MasterFields”链接到“父”表单上的数据绑定“类别”字段,这样的网格项目随着类别字段的变化而变化。这个 Items 网格还可以轻松地添加新记录,同时自动填充 ItemID(在 tblItem AND 表 tblItemCategory 中)和链接的 CategoryID 字段(在 tblItemCategory 中)。

对该 Access 表单的网格的查询是:
选择 tblItemCategory.CategoryID,tblItem.*
从 tblItemCategory 左连接 tblItem ON tblItemCategory.ItemID = tblItem.ItemID
按 tblItemCategory.CategoryID 排序;

如果我在 Delphi 中尝试相同的操作,ItemID 自动编号字段不会被填充,从而导致以下错误:

..exception class EOleException with message 'The field 'tblItemCategory.ItemID' 不能包含 Null 值,因为该字段的 Required 属性设置为 True。在此字段中输入一个值'。

..并且 ItemID 字段在网格中相应地是空白的。

有没有办法让 Delphi/ADO 像 Access 一样轻松/整齐地处理幕后的两表 ItemID 填充,而无需以编程方式手动处理?如果没有,以编程方式处理它的最佳/最优雅的方式是什么?

我希望我最终得到的任何解决方案都尽可能与传统的 TDataSet / TDataSource 方法密切相关,因为我使用了许多不同类型的数据绑定控件,所有这些都必须处理同样的问题数据结构。

(注意:我使用的是 Delphi 2007 和 MSAccess 2000 格式的 MDB 文件。)

【问题讨论】:

  • 表之间的关系我不清楚,可以补充一些信息(架构...)
  • 我对您所描述的 Access 功能很熟悉,但我不太明白您想要实现什么。您是否尝试自动填充 tblItemCategory 中的两个键列?如果表中没有其他字段,这样做的目的是什么?另外:您在哪里以及如何选择第二个键列的值?如果您“只是”尝试自动填充类别 id 列(因为您已经加入了项目),@Tony 的回答完全中肯,我不明白您对他的回答的评论。

标签: delphi ms-access ado


【解决方案1】:

几乎是一样的。 Theres 的主源和主字段属性,因此您只需将详细信息链接到主字段。

所以 mastersource 将是 Customer、Detail Source、由 CustomerID 链接的 Orders。

很容易展示这一点,但很难解释。

不过是其他人写的。

Master Detail Forms And Delphi

【讨论】:

  • 感谢您的回复。这是我理解并且可以做到的。我遇到问题的地方是三个表再现(多对多)而不是两个表“标准版本”(一对多)。需要添加两个表,而不仅仅是一个。
  • 啊查找通常是最好的方法。如果两个 id 都不是链接表中的空外键。您选择(或添加并选择)每一个,然后在链接表中插入一个。按照您当前的想法,使 UI 起作用的唯一方法是链接表中的代理键,并且 CategoryID 和 ItemID 都允许为空。有点畏缩,或者通过加入来更新。
【解决方案2】:

如果您想通过网格向表中添加新记录,则必须使用底层查询的 BeforePost 方法来获取新键,然后手动将其与链接表一起插入类别标识。

我承认我从不使用可编辑(和可插入)网格编写代码,因此我的答案可能需要稍作调整。

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多