1

现有的 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);

现在我的问题是:如何在不修改框架/库代码的情况下在足够低的级别引入这种行为?

4

0 回答 0