使用单个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_Identifier
和Courier_Identifier
),因此插入记录时出错,
无法将值Null插入列'FK_Courier_Identifier',表Courier_VT;列不允许null
但是在Courier表中发布了一条记录,我知道我需要在发布之前将Courier_Identifier
分配给FK_Courier_Identifier
,但不知道如何以及在何处进行
我们如何在此场景中插入\删除记录?是否可以使用单个TADOQuery
来实现?
答案 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