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

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

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

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

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

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

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

笔记:我知道还有其他选择(执行 DELETE 查询可以完成这项工作)。只要告诉我一种在 ADO 中执行此操作的方法,或者说它无法完成。

有帮助吗?

解决方案

将您的查询重写为:

  • 将 INNER JOIN 替换为包含 EXISTS 的 WHERE 子句;
  • 在 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 数据网格控件 (MSDATGRD.OCX) 的 DataSource 属性,然后通过网格删除该行(我假设您正在执行类似的操作),并且该行确实是仅从表元素中删除(即组中的行保持未删除状态)。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top