7

使用一个TADOQueryi 使用左外连接从两个不同的表中提取记录:

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

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

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

无法在表 Courier_VT 的“FK_Courier_Identifier”列中插入值 Null;列不允许为空

但是在 Courier 表中发布了一条记录,我知道我需要在发布之前将其分配给Courier_IdentifierFK_Courier_Identifier不知道如何以及在哪里执行

在这种情况下我们如何插入\删除记录?是否有可能使用单个来实现TADOQuery

4

1 回答 1

1

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

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

这么说,您最好的选择可能是使用 BeforeDelete 和 BeforePost 事件处理程序来处理您的场景。基本上,您将使用它们来发出 DML 语句,使用一些存储过程或 sql 组件执行它,然后中止事件处理程序。检查此SO 问题的已接受答案以获取更多信息和代码示例。


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

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

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

高温高压

于 2012-10-26T07:23:30.050 回答