1

環境:

MySQL C コネクタを使用してコードを書いています。

不具合:

データをフェッチするための 2 回目 (およびそれ以降のすべて) の呼び出しでは、常に「コマンドが同期されていません」「このコマンドを今すぐ実行できません」というエラーが返されます。

  • 呼び出しごとに同じSQLを実行しています。
  • 呼び出し間の接続を閉じると、エラーは発生しません。

アルゴリズム:

ストアド プロシージャの呼び出しを準備します。

メタデータを取得するには、mysql_stmt_result_metadata() を呼び出します。

結果をバインドします。

mysql_stmt_store_result() を呼び出して結果をバッファします。

すべての結果を取得するには、mysql_stmt_fetch() を呼び出します。

終了したら mysql_stmt_free_result() を呼び出します。

mysql_stmt_close() を呼び出します。

この例からコードをモデル化しました。私が行った唯一の変更は、mysql_stmt_store_result() を呼び出すことでした。これにより、フェッチする前に結果セットのサイズを取得できました。

助言がありますか?

4

1 に答える 1

2

この段落は手がかりを与えます:

「プログラムで CALL ステートメントを使用してストアド プロシージャを実行する場合、CLIENT_MULTI_RESULTS フラグを有効にする必要があります。これは、プロシージャ内で実行されたステートメントによって返される可能性のある結果セットに加えて、各 CALL が呼び出しステータスを示す結果を返すためです。 CALL は複数の結果を返す可能性があるため、mysql_next_result() を呼び出すループを使用してそれらを処理し、さらに結果があるかどうかを判断します。"

ストアド プロシージャは 1 つの結果セットのみを返し、出力パラメーターを持たない場合がありますが、多数の結果セットを受け取り、一部は同一で、一部は空です。出力パラメーターではないとマークされている最初の結果セットを使用すると、うまくいくようです。

于 2013-06-24T22:31:52.700 に答える