3

Doctrine2を使用してアプリケーションを作成しました。これは、MySQLまたはPostgresデータベースで使用するとうまく機能します。

ここで、SQL ServerとSybaseで共有されるTDS(表形式のDataStreamプロトコル)の実装を使用するPDOドライバーDBLibを使用して、アプリケーションをSQLServer2008データベースに接続しました。FreeTDS

INSERTDoctrineSQLServerPlatformとMSSQLDriverパッケージを微調整した後、最初のスキーマの作成、トランザクション、およびテーブルへのsは正常に機能します。

しかし、データを選択すると、次のエラーが発生します。

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

たくさんグーグルした後、私はFreeTDSのFAQでこの詳細を見つけました:

他のデータベースサーバーでのプログラミングに慣れている場合は、TDSプロトコルのこの側面に最初に遭遇したときに驚くかもしれません。[...]

サーバーは、クライアントにクエリからのすべての結果を読み取るか、それ以上の行が不要であることを示す、つまりキャンセルを発行することを要求します。これらの2つのいずれかが発生するまで、サーバーはその接続で新しいクエリを受け入れません。「保留中の結果」について文句を言います。

したがって、エラーメッセージの原因は、何らかの理由でDoctrine(DBAL-> PDO-> FreeTDS)が接続バッファーからすべての結果行を読み取らず、サーバー/ライブラリがアプリケーションに新しい発行を許可しないことです。exec()/execute()すべての行が読み取られるまで。

  • $doctrinequery->getResults()結果が返される前にすべての結果を取得するという私の理解は正しいですか?
  • $entity->getLinkedEntity()(つまり$user->getGroupNames())返される前にすべての結果をフェッチするという私の理解は正しいですか?
  • 問題がどこにあるのか、どのように対処しますか?
    スタックトレースはまったく役に立たず、コードベースはすでに拡張されています。
  • 他の誰かがすでにこの問題を抱えていて、いくつかの洞察を共有することができましたか?
  • この問題が発生しないDoctrineをMSSQLに接続するために使用できる代替手段はありますか?
4

1 に答える 1

1

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

于 2013-10-16T09:28:17.987 に答える