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