0

Microsoft 3.0 ドライバーで PHP 5.4 を使用して、SQL サーバー 2008 でストアド プロシージャを実行します。更新を行っているだけで結果を返さないプロシージャを実行するまでは正常に動作します。私が得るエラーメッセージは次のとおりです。

SQLSTATE[IMSSP]: The active result for the query contains no fields.

機能しない手順は、次の単純なコードに要約されます。

CREATE PROCEDURE [dbo].[sp_communication_increase_trials]
    @comId bigint = NULL
AS
BEGIN

    SET NOCOUNT ON

    IF NOT @comId IS NULL
    BEGIN
        UPDATE Communication SET CommunicationTrials = CommunicationTrials + 1 WHERE id = @comId;
    END;

END

fetchAll上記の手順を実行するときのメソッドでの PHP コード barfs :

if ($stmt->execute()) {
    do {
        $rowset = $stmt->fetchAll(PDO::FETCH_ASSOC);
        if ($rowset) {
            $results[] = $rowset;
        }
    } while ($stmt->nextRowset());

}
return $results;

ただし、プロシージャの update-statement の後に単純な select を追加すると機能しますが、これは必須ではありません。

4

1 に答える 1

0

私が思いついた解決策は、プロシージャを実行して結果を返すメソッドにブール値を引数として追加して、返される結果セットが期待されるかどうかを示すことでした。ブール値は、TRUE明示的に指定されていない限り、デフォルトで に設定されますFALSE

この方法fetchAllでは、呼び出されないように指示されたときにメソッドが呼び出されません。

if ($stmt->execute() && $do_return_rowsets) {
    do {
        $rowset = $stmt->fetchAll(PDO::FETCH_ASSOC);
        if ($rowset) {
            $results[] = $rowset;
        }
    } while ($stmt->nextRowset());

} 

行セットを返すかどうかを PHP コードとプロシージャーの間の契約で指定するのは、おそらく公正とは言えません。

于 2013-05-20T07:04:21.873 に答える