You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取CDatabase事务中ExecuteSQL操作的受影响记录数?

CDatabase事务中获取SQL受影响记录数的简便方案

CDatabase本身没有提供类似CDaoDatabase::GetRecordsAffected()的直接接口,但针对MDB文件,你可以通过以下两种简便方案实现需求:

方案1:调用ODBC原生接口SQLRowCount

CDatabase底层基于ODBC,可通过其连接句柄调用SQLRowCount获取最近一次DML(DELETE/INSERT/UPDATE)语句的受影响行数:

  1. 若你的类不是CDatabase子类,可派生扩展类暴露连接句柄:
class CDatabaseEx : public CDatabase
{
public:
    HDBC GetConnectionHandle() { return m_hdbc; }
};
  1. 执行ExecuteSQL后调用SQLRowCount:
// 假设pDb是CDatabaseEx指针,已开启事务并执行DML
SQLINTEGER affectedRows = 0;
SQLRowCount(pDb->GetConnectionHandle(), &affectedRows);
// affectedRows即为受影响记录数

注意:DDL(如ALTER)语句执行后,SQLRowCount通常返回-1,无法获取有效数值,这类语句需单独处理;事务开启状态下该方法依然有效。

方案2:利用Jet SQL的@@ROWCOUNT变量

Access MDB的Jet引擎支持@@ROWCOUNT变量,存储最近一次DML语句的受影响行数,执行DML后直接查询该变量即可:

// 先执行目标SQL
pDb->ExecuteSQL("UPDATE Users SET Status = 1 WHERE Age > 18");
// 查询受影响行数
CRecordset rs(pDb);
rs.Open(CRecordset::forwardOnly, "SELECT @@ROWCOUNT", CRecordset::readOnly);
if (!rs.IsEOF())
{
    long affectedCount;
    rs.GetFieldValue(0, affectedCount);
    // 用affectedCount验证执行结果,决定提交/回滚
}
rs.Close();

该方案无需依赖ODBC底层细节,代码更贴近Jet引擎特性,同样仅对DML语句有效。

对比构造SELECT统计的方案,以上两种方法无需重复编写WHERE条件,工作量大幅降低,可根据你的代码架构选择合适的方案。

内容的提问来源于stack exchange,提问作者Kyudos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:07:08