当整个应用程序从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);
现在我的问题是:如何在足够低的水平上引入此行为而无需修改框架/库代码?