gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:54:38 25 4
gpt4 key购买 nike

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

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

我使用 TDBGrid 成功地将字段更新发布到我的 MSSQL 数据库。

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

Cannot Insert the value Null in to column 'FK_Courier_Identifier', table Courier_VT; column does not allow null

但是记录已发布在 Courier 表中,我确实知道在发布之前需要将 Courier_Identifier 分配给 FK_Courier_Identifier 但不知道如何以及在哪里执行此操作

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

最佳答案

当多个表连接时,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

关于sql-server - TADOQuery 连接表 - 从结果中插入\删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13074765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com