选择Doctrine和MS SQL 2008的问题



我们使用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

相关内容

  • 没有找到相关文章

最新更新