2012-11-08 1 views
3

Мы написали приложение с использованием Doctrine2, которое отлично работает при использовании с базой данных MySQL или Postgres.Проблемы с SELECT с Doctrine и MS SQL 2008

Теперь мы подключили приложение к базе данных SQL Server 2008 с использованием PDO Driver DBLib, которая использует реализацию FreeTDS для протокола TDS (табличный протокол DataStream), который совместно используется SQL Server и Sybase.

Начальная схема создания, транзакции и INSERT s в столы прекрасно работают .. после некоторой настройки Doctrine SQLServerPlatform и нашего пакета драйверов MSSQL.

Но при выборе данных, мы сталкиваемся следующее сообщение об ошибке:

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

После большого количества прибегая к помощи я нашел this detail in the FAQ of FreeTDS:

If you are accustomed to programming with other database servers, you may be surprised when you first encounter this aspect of the TDS protocol. [...]

The server requires the client either to read all the results from a query, or to indicate that no further rows are desired i.e., to issue a cancellation. Until one of those two things happens, the server will not accept new queries on that connection. It will complain about "pending results".

Таким образом, причиной появления сообщения об ошибке в том, что по какой-то причине, Doctrine (DBAL-> PDO-> FreeTDS) не считывал все строки результатов из буфера соединения, и сервер/библиотека не разрешает приложению выпускать новый exec()/execute(), пока все строки не будут прочитаны.

  • Насколько я понимаю, что $doctrinequery->getResults() извлекает все результаты до его возвращения?
  • Насколько я понимаю, что $entity->getLinkedEntity() (т. Е. $user->getGroupNames()) извлекает все результаты до его возвращения?
  • Как бы вы решали, где именно проблема?
    Пакет стека не помогает нам вообще, и кодовая база уже выросла.
  • У кого-нибудь еще есть эта проблема и вы можете поделиться некоторыми сведениями?
  • Есть ли альтернатива, которую мы можем использовать для подключения Доктрины к MSSQL, которая не страдает этой проблемой?

ответ

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