覆盖CDbCommand-> queryInternal()

时间:2013-10-22 09:25:38

标签: php sql-server-2008 yii sqlsrv

当整个应用程序从Lunix迁移到Windows时,必须将现有的yii-Framework应用程序迁移到使用 {pdo _,} sqlsrv 与SQL-Server后端进行通信。

有几个(不可变的)存储过程的调用产生多个行集。传统的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);

现在我的问题是:如何在足够低的水平上引入此行为而无需修改框架/库代码?

0 个答案:

没有答案