3

我们使用 Doctrine2 编写了一个应用程序,它在与 MySQL 或 Postgres 数据库一起使用时效果很好。

现在,我们使用PDO 驱动程序 DBLib将应用程序与 SQL Server 2008 数据库连接起来,该数据库使用FreeTDS由 SQL Server 和 Sybase 共享的 TDS(表格数据流协议)的实现。

在对 Doctrine和我们的 MSSQL 驱动程序包进行了一些调整之后,初始模式创建、事务和INSERT表中的 s 工作正常。SQLServerPlatform

但是在选择数据的时候,我们会遇到如下错误:

General error: 20019 Attempt to initiate a new Adaptive Server operation with results pending

经过大量的谷歌搜索,我在 FreeTDS 的常见问题解答中找到了这个细节

如果您习惯于使用其他数据库服务器进行编程,那么当您第一次遇到 TDS 协议的这一方面时,您可能会感到惊讶。[...]

服务器要求客户端要么读取查询的所有结果,要么指示不需要更多行,即发出取消。在这两种情况之一发生之前​​,服务器不会接受该连接上的新查询。它会抱怨“未决结果”。

所以错误消息的原因是由于某种原因,Doctrine (DBAL->PDO->FreeTDS) 没有从连接缓冲区中读取所有结果行,并且服务器/库不允许应用程序发出新的exec()/execute()直到读取所有行。

  • 我的理解是否正确,$doctrinequery->getResults()在返回之前获取所有结果?
  • 我的理解是否正确$entity->getLinkedEntity()(即$user->getGroupNames())在返回之前获取所有结果?
  • 您将如何解决问题的确切位置?
    堆栈跟踪根本没有帮助我们,代码库已经增长。
  • 有没有其他人已经遇到这个问题并且可以分享一些见解?
  • 我们可以使用其他替代方法将 Doctrine 连接到不受此问题影响的 MSSQL 吗?
4

1 回答 1

1

我对 PDO Driver 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

于 2013-10-16T09:28:17.987 回答