Excluindo linhas em tabelas unidas usando ADO
Pergunta
Agora que tenho visto esta pergunta em outro fórum , mas ele não tinha uma resposta aceitável.
Suponha que eu tenho duas tabelas, a tabela de grupos ea tabela de elementos. As mesas têm relações não definido. A tabela Elements tem um campo IdGroup que se refere ao campo IdGroup (PK) da tabela de Grupos.
Eu uso a seguinte consulta através de um conjunto de registros ADO para preencher os valores tabelas para um datagrid:
SELECT Elements.*, Groups.GroupName
FROM Elements
INNER JOIN Groups ON Elements.IdGroup = Groups.IdGroup
A partir desse grade eu quero pressione Delete para apagar um elemento. Aqui está o meu problema. Quando eu usei DAO, a função DAO Delete () excluído somente o registro no grupo Elements. Este foi o comportamento esperado.
Quando eu mudei para ADO, a função Delete () eliminou registros em ambas as tabelas, o registro elemento e do grupo ao qual o elemento pertencia!
Existe alguma maneira para reproduzir o comportamento DAO no ADO sem ter que definir relacionamentos nas tabelas?
Nota: Eu sei que existem alternativas (executando querys de DELETE poderia fazer o trabalho). Apenas mostre-me uma maneira de fazer isso no ADO, ou dizer que não pode ser feito.
Solução
Reescreva você consulta para:
- substituir junção interna com um WHERE consistindo de um EXISTE;
- usar uma subconsulta na cláusula SELECT para retornar o valor de Groups.GroupName.
Exemplo:
SELECT Elements.*,
(
SELECT Groups.GroupName
FROM Groups
WHERE Elements.IdGroup = Groups.IdGroup
)
FROM Elements
WHERE EXISTS (
SELECT *
FROM Groups
WHERE Elements.IdGroup = Groups.IdGroup
);
Eu testei isso usando SQL Server 2008 com um conjunto ADO conjunto de registros como a propriedade DataSource de um OLEDB controle DataGrid Microsoft (MSDATGRD.OCX), em seguida, apagar a linha através do gird (eu suponho que você está fazendo algo similar) eo linha é efectivamente suprimida a partir de elementos de mesa só (ou seja, a linha em Grupos permanece undeleted).
Observe a consulta revisto pode ter um impacto negativo no desempenho quando buscar linhas.