关于dao:使用ADO删除联接表中的行

关于dao:使用ADO删除联接表中的行

Deleting rows in joined tables using ADO

现在,我在另一个论坛上看到了这个问题,但没有一个可接受的答案。

假设我有两个表,Groups表和Elements表。这些表没有定义的关系。 Elements表具有一个IdGroup字段,该字段引用Groups表的IdGroup(PK)字段。

我通过ADO记录集使用以下查询来将表值填充到datagrid中:

1
2
3
SELECT Elements.*, Groups.GroupName
FROM Elements
INNER JOIN Groups ON Elements.IdGroup = Groups.IdGroup

从该网格中,我想按Delete键以删除元素。这是我的问题。当我使用DAO时,DAO Delete()函数仅删除Elements组中的记录。这是预期的行为。

当我更改为ADO时,Delete()函数删除了两个表,元素记录和元素所属的组中的记录!

有什么方法可以在ADO中重现DAO行为,而不必在表中定义关系?

注意:我知道还有其他选择(执行DELETE查询可以完成此工作)。只是向我展示一种在ADO中执行此操作的方法,或者说它无法完成。


将查询重写为:

  • 用由EXISTS组成的WHERE子句替换INNER JOIN;
  • 在SELECT子句中使用子查询返回Groups.GroupName的值。

例:

1
2
3
4
5
6
7
8
9
10
11
12
SELECT Elements.*,
       (
        SELECT Groups.GroupName
          FROM Groups
         WHERE Elements.IdGroup = Groups.IdGroup
       )
  FROM Elements
 WHERE EXISTS (
               SELECT *
                 FROM Groups
                WHERE Elements.IdGroup = Groups.IdGroup
              );

我已经使用SQL Server 2008进行了测试,并将ADO记录集设置为Microsoft OLEDB Datagrid Control(MSDATGRD.OCX)的DataSource属性,然后通过网格删除了行(我假设您正在做类似的事情),并且该行的确是 仅从表元素中删除(即,"组"中的行保持未删除状态)。

请注意,修改后的查询在获取行时可能会对性能产生负面影响。


推荐阅读