【问题标题】:TADOQuery Join tables - Insert \ Delete records from resultTADOQuery 连接表 - 从结果中插入\删除记录
【发布时间】:2012-10-25 18:20:37
【问题描述】:

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

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)插入记录时出现错误,

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

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

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

【问题讨论】:

  • 您可以使用Unique Table ADO 动态属性。可能重复的here。但是我不确定Insert \ Update 部分是否有效(我现在无法验证)。而且我相信您需要在BeforePost 上指定FK_Courier_Identifier

标签: sql-server delphi ado


【解决方案1】:

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

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

这么说,您最好的选择可能是使用 BeforeDelete 和 BeforePost 事件处理程序来处理您的场景。基本上,您将使用它们来发出 DML 语句,使用一些存储过程或 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

【讨论】:

  • ADOQuery 能够处理更新\删除但不能插入,我正在查看您的链接,谢谢!
  • 我在阅读您的评论后编辑了我的答案。希望它现在对您有所帮助!
猜你喜欢
  • 2016-05-02
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2018-02-24
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多