gpt4 book ai didi

delphi - 如果用户通过 dbgrid 更改数据,则不会触发 AdoConnection 的 ExecuteCompleted

转载 作者:行者123 更新时间:2023-12-01 22:59:06 24 4
gpt4 key购买 nike

如果我执行类似的查询

Update Table Set aField = 1 Where tablePk = 1

我可以从AdoConneciton的ExecuteComplete事件中获取受影响的记录数(RecordsAffected参数)。但如果我通过 dbgrid 更改数据,则不会触发 ExecuteComplete 事件。

在 dbgrid 执行插入/更新/删除命令后如何获取受影响的记录计数?

最佳答案

我认为在进行更新时没有办法获取受影响的行数,通过 TDBgrid 或其他数据库感知组件(如 TDBNavigator)插入和删除。原因是DB感知控件调用TDataSet的Post和Delete方法,并且这些调用覆盖TAdoCustomDataSet中的InternalPost和InternalDelete。它们的工作方式与通过 TAdoQuery 等 ExecSql 方法执行 SQL 语句完全不同。

根据设计,TDataSet.Post 和 TDataSet.Delete 应该只影响单行,因此如果操作成功,您就知道只有一行受到影响。

值得注意的是,尽管对您想要做的事情没有太大帮助,但一种方法可以将相同的事件处理程序附加到数字共享 TAdoConnection 的 TAdoCustomDataSet 后代,如以下代码所示:

procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
begin
for i := 0 to AdoConnection1.DataSetCount - 1 do
AdoConnection1.DataSets[i].AfterPost := AfterPost;
AdoQuery1.Open;
AdoQuery2.Open;
end;

procedure TForm1.AfterPost(DataSet: TDataSet);
var
Q : TAdoQuery;
begin
if DataSet is TAdoQuery then begin
Q := TAdoQuery(DataSet);
Caption := IntToStr(Q.RowsAffected);
end
else
Caption := 'Post';
end;

当然,如果涉及的数据集已经有自己的事件处理程序,您需要一些结构来存储现有的处理程序和链共享处理程序中右侧的一个(例如上面的 TForm1.AfterPost)。

如果您尝试上述代码并观察发布编辑时会发生什么从从 TAdoQuery 获取数据的 DBGrid 中,您会发现不幸的是,RowsAffected 为零。这是因为 TAdoQuery 的 FRowsAffected 仅在其调用了 ExecSql 方法,但不会调用它来进行数据集操作通过 DBGrid 调用。区别在于 AdoConnection 的OnExecuteComplete 从用于执行的 Command 对象中调用TAdoQuery 的 ExecSql。从 DBGrid、otoh、调用发起的操作与 TAdoCustomDataSet 的 InternalPost 和 InternalDelete 关联的 RecordSet 对象的方法,并且不会调用 AdoConnection 的 OnExecuteComplete

RecordSet 对象有自己的事件集,请参见 f.i. RecordSetEvents在 ADOInt.Pas 中,可以想象您可以为以下内容设置共享事件处理程序这些与上面的共享 AfterPost 事件示例类似。然而,如果您想获得,我认为这对您没有任何用处从调用的 TDataset Insert/Update/Delete 的 RowsAffected 值DBGrid(或者说连接到其 TDataSource 的 TDBNavigator)。

我这么说的原因是,如果你看一下源代码TAdoCustomDataSetInternalPost 方法,您将看到它包含

  if State = dsEdit then
UpdateData
else
begin
Recordset.AddNew(EmptyParam, EmptyParam);
try
UpdateData;
except

嵌套的UpdateData通过调用来完成它的工作

    Recordset.Update(EmptyParam, EmptyParam);

现在,如果您查看 RecordSet.Update 的 MS 文档,您会看到例如

https://msdn.microsoft.com/en-us/library/ecc2bf09.aspx?f=255&MSPPError=-2147217396

其中明确指出,如果 Update 不影响恰好一条记录,则引发异常。我想这就是 @KenWhite 当他说时的想法“只会更新一条记录”。所以如果 RecordSet.Update 成功,您知道只有一行受到影响。

我还没有检查过,但由于 TAdoCustomDataSet.InternalDelete 使用其 Recordset反对删除,类似的情况也可能是这样。

关于delphi - 如果用户通过 dbgrid 更改数据,则不会触发 AdoConnection 的 ExecuteCompleted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37212197/

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