1

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

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

我通过 ADO 记录集使用以下查询将表值填充到数据网格:

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 中执行此操作的方法,或者说它无法完成。

4

1 回答 1

1

将您的查询重写为:

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

例子:

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 控件(MSDATGRD.OCX)的 DataSource 属性,然后通过网格删除该行(我假设你正在做类似的事情)并且该行确实是仅从表元素中删除(即组中的行保持未删除)。

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

于 2009-01-08T12:19:45.017 回答