TADOQuery连接表 - 从结果中插入\删除记录

时间:2012-10-25 18:20:38

标签: sql-server delphi ado

使用单个TADOQuery i使用左外连接从两个不同的表中提取记录:

Select M*, D.* from Courier M Left outer join Courier_VT D on M.Courier_Identifier = D.FK_Courier_Identifier

我使用TDBGrid成功将字段更新发布到我的MSSQL DB。

由于存在外键引用(FK_Courier_IdentifierCourier_Identifier),因此插入记录时出错,

  

无法将值Null插入列'FK_Courier_Identifier',表Courier_VT;列不允许null

但是在Courier表中发布了一条记录,我知道我需要在发布之前将Courier_Identifier分配给FK_Courier_Identifier,但不知道如何以及在何处进行

我们如何在此场景中插入\删除记录?是否可以使用单个TADOQuery来实现?

1 个答案:

答案 0 :(得分:1)

当连接多个表时,AFAIK TADOQuery无法处理插入/删除/更新语句。其背后的原因是它无法知道它必须更新哪个表或如何更新。

其他数据库访问组件的常用方法是为每种类型的DML语句提供属性(ODAC components是一个示例)或者您必须添加链接到查询的第二个“更新SQL”组件将包含DML语句(Zeos是使用此方法的组件的一个示例)。

说这个,最好的办法是使用BeforeDelete和BeforePost事件处理程序来处理你的场景。基本上你会用它们来发出DML语句,用一些storedproc或sql组件执行它,然后中止事件处理程序。检查此SO question的已接受答案以获取更多信息和代码示例。


编辑:如果您的代码可以像您在评论中所说的那样处理更新和删除,那么问题只在于插入时FK_Courier_Identifier的分配(应该已阅读更仔细地提问...),您可以使用OnBeforePost事件处理程序解决这个问题:

procedure TMyForm.MyADOQueryBeforePost(Sender: TObject);
begin
  MyADOQuery.FieldByName('FK_Courier_Identifier').AsString := CourierId;
end;

当然,您需要调整此代码,因为在这里我假设该字段是varchar,并且您在将数据库插入Courier ID之前就知道了。

HTH