现有的 yii-Framework 应用程序必须迁移到使用{pdo_,}sqlsrv与 SQL-Server 后端通信,因为整个应用程序正在从 Lunix 迁移到 Windows。
有几次调用(不可变)存储过程会产生多个行集。幸运的是,旧版 mssql-driver 忽略了前者。使用 sqlsrv,必须sqlsrv_next_result()
在结果句柄上使用,以避免SQLSTATE[IMSSP]: The active result for the query contains no fields
并跳到相关/可用的行集。
作为 yii 的新手,我发现无法CDbCommand
在足够低的级别引入扩展,以便 AR 等仍然可以运行。因此,我当前的解决方案直接修改了框架/库代码,一旦我们投入生产,这显然不是一个选择。
这是我对库的修改(从 CDbCommand.php#515 开始):
$retry_hack = false;
do {
try {
$result=$this->_statement->$method();
$retry_hack = false; // won't get here on throw
}
catch (PDOException $e) {
// If we do not have any more rowsets we obviously have
// a proper exception at this point and just re-throw
// it to whomever wants to catch it.
if (!($retry_hack = true === $this->_statement->nextRowset())) {
throw $e;
}
}
} while ($retry_hack);
现在我的问题是:如何在不修改框架/库代码的情况下在足够低的级别引入这种行为?