From b3049bb9e3e897e97b61fe52449e9fa31b36e1c4 Mon Sep 17 00:00:00 2001 From: Mark Newnham Date: Wed, 11 Mar 2026 03:40:29 -0600 Subject: mssql: fix regression retrieving affected_rows in SQL Server Retrieves affected rows before connection closed if necessary. Fixes #606, PR #1216 --- drivers/adodb-mssqlnative.inc.php | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/adodb-mssqlnative.inc.php b/drivers/adodb-mssqlnative.inc.php index 5d225653..43a8564c 100644 --- a/drivers/adodb-mssqlnative.inc.php +++ b/drivers/adodb-mssqlnative.inc.php @@ -63,6 +63,22 @@ class ADODB_mssqlnative extends ADOConnection { var $length = 'len'; var $hasAffectedRows = true; var $poorAffectedRows = false; + + /** + * Holds the affected rows if triggered by close + * + * @var bool|int + */ + public $affectedRowCount = false; + + /** + * Flag that indicates if an affected_rows value + * is required + * + * @var bool + */ + public bool $needsAffectedRowCount = false; + var $metaDatabasesSQL = "select name from sys.sysdatabases where name <> 'master'"; var $metaColumnsSQL = @@ -171,8 +187,11 @@ class ADODB_mssqlnative extends ADOConnection { function _affectedrows() { + if ($this->_queryID && is_resource($this->_queryID)) { return sqlsrv_rows_affected($this->_queryID); + } else if ($this->affectedRowCount !== false) { + return $this->affectedRowCount; } return false; } @@ -667,6 +686,9 @@ class ADODB_mssqlnative extends ADOConnection { $sql = $sql[1]; } + $this->affectedRowCount = false; + $this->needsAffectedRowCount = false; + // Handle native driver flaw for retrieving the last insert ID if ($this->hasInsertID) { // Check if it's an INSERT statement @@ -683,6 +705,10 @@ class ADODB_mssqlnative extends ADOConnection { $retrieveLastInsertID = false; } + if ($sql && preg_match('/^\W*(update|delete)/i',$sql)){ + $this->needsAffectedRowCount = true; + } + if ($inputarr) { // Ensure that the input array is indexed numerically, as required // by sqlsrv_query(). If param() was used to create portable binds @@ -1449,6 +1475,12 @@ class ADORecordset_mssqlnative extends ADORecordSet { */ $this->connection->errorMsg(); if(is_resource($this->_queryID)) { + if ($this->connection->needsAffectedRowCount) { + $this->connection->affectedRowCount = sqlsrv_rows_affected($this->_queryID); + } else { + $this->connection->affectedRowCount = false; + } + $rez = sqlsrv_free_stmt($this->_queryID); $this->_queryID = false; return $rez; -- cgit v1.3