我们使用Doctrine2编写了一个应用程序,当与MySQL或Postgres数据库一起使用时,它工作得很好。
现在,我们使用PDO驱动程序DBLib将应用程序与SQL Server 2008数据库连接起来,该数据库使用TDS(表格数据流协议)的FreeTDS
实现,该协议由SQL Server和Sybase共享。
最初的模式创建,事务和INSERT
到表中工作正常..在对DoctrineSQLServerPlatform
和我们的MSSQL驱动程序包进行一些调整后。
但是在选择数据时,我们面临以下错误:
General error: 20019 Attempt to initiate a new Adaptive Server operation with results pending
经过大量的谷歌搜索,我在FreeTDS的FAQ中找到了这个细节:
如果您习惯于使用其他数据库服务器进行编程,那么当您第一次遇到 TDS 协议的这一方面时,您可能会感到惊讶。 [...]
服务器要求客户端读取查询的所有结果,或者指示不需要更多行,即发出取消。在发生这两种情况之一之前,服务器不会接受该连接上的新查询。它将抱怨"待定结果"。
因此,错误消息的原因是,由于某种原因,Doctrine (DBAL->PDO->FreeTDS) 没有从连接缓冲区读取所有结果行,并且服务器/库不允许应用程序发出新的exec()
/execute()
,直到读取所有行。
- 我的理解是正确的,
$doctrinequery->getResults()
在返回之前获取所有结果? - 我的理解是正确的吗
$entity->getLinkedEntity()
(即$user->getGroupNames()
) 在返回之前获取所有结果? - 您将如何解决问题的确切位置?
堆栈跟踪对我们根本没有帮助,代码库已经增长。 - 有没有人已经遇到这个问题并且可以分享一些见解?
- 有没有一种替代方案可以用来将 Doctrine 连接到 MSSQL,而不会遇到此问题?
我在PDO驱动程序DBLib和事务方面遇到了类似的问题。我以这种方式修复了它:
$this->_db->beginTransaction();
$st = $this->_db->prepare("StoredProcedure ?");
$st->execute(array($data));
$results= $st->fetchAll();
$st->closeCursor();
// more stuff
$this->_db->commit();
closeCursor()
解决了我的问题:http://php.net/manual/en/pdostatement.closecursor.php