如何获取CDatabase事务中ExecuteSQL操作的受影响记录数?
CDatabase事务中获取SQL受影响记录数的简便方案
CDatabase本身没有提供类似CDaoDatabase::GetRecordsAffected()的直接接口,但针对MDB文件,你可以通过以下两种简便方案实现需求:
方案1:调用ODBC原生接口SQLRowCount
CDatabase底层基于ODBC,可通过其连接句柄调用SQLRowCount获取最近一次DML(DELETE/INSERT/UPDATE)语句的受影响行数:
- 若你的类不是
CDatabase子类,可派生扩展类暴露连接句柄:
class CDatabaseEx : public CDatabase { public: HDBC GetConnectionHandle() { return m_hdbc; } };
- 执行
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
相关产品推荐
相关产品推荐

