- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我执行类似的查询
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)。
我这么说的原因是,如果你看一下源代码TAdoCustomDataSet
的 InternalPost
方法,您将看到它包含
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/
我刚刚决定解决 MSSQL 数据库服务器重新启动时的“连接”问题,并且连接永远断开。 到目前为止,唯一的解决方案是重新启动程序,但在距离很远的服务器上并不总是那么容易(并且必须首先检测到问题)。 **
我有以下代码引发 EConvertError -“无法将 TAdoConnection 分配给 TAdoConnection” var wTmpADOConn : TADOConnec
这个问题已经有答案了: ADO Connection Timeout problem (2 个回答) 已关闭 6 年前。 我有一个控制服务器连接的功能。如果 ado 在 5 秒内无法连接,则应该给出错
我正在使用TIdHTTPServer创建一个简单的Indy网络服务器。几乎所有请求服务器都需要与数据库通信(通过TAdoConnection)。看到数据库连接在资源方面有点昂贵,我想创建一个池机制来重
我正在尝试打开一个 ADOConnection 组件。数据库为 MDB 格式。我使用 JET 访问它。 每当我在代码中使用 AdoConnection.Open 时,都会弹出窗口并询问用户 ID 和密
Delphi XE3,Win7教授 我需要写入 DBASE 3(旧格式)文件,以便为类似 DOS 的应用程序(Clipper?)导出数据。好吧,我想:MS DBASE 驱动程序可以做到这一点。 但我对
我需要通过 TADOConnection 连接到 Excel 表,但我不知道要在 ConnectionString 属性中写入什么内容。对于 Excel 版本 8,我使用 Jet,对于 12,我使用
如果我执行类似的查询 Update Table Set aField = 1 Where tablePk = 1 我可以从AdoConneciton的ExecuteComplete事件中获取受影响的记
我的一些 MS SQL 存储过程使用“print”命令生成消息。在我的 Delphi 2007 应用程序中,它使用 TADOConnection 连接到 MS SQL,如何查看这些“打印”命令的输出?
我在 Delphi 7 应用程序的特定情况下遇到了问题。 我有 ADOConnection,它使用一些用户名连接到我的 MS SQL 服务器并通过 - SQL 身份验证。问题是 MS SQL 登录是使
我是一名优秀的程序员,十分优秀!