0

MYSQL で実行する CakePHP でアプリを開発しましたが、問題なく動作しています。PHP のバージョンは 5.4.16、Apache 2.4.4、最新の XAMP です。CakePHP バージョン: 2.3.0

MSSQL にも同様のデータベースが既にあります。次に、この MSSQL でもアプリを実行します。

これには、MSSQL ドライバーに php_pdo_sqlsrv_54_ts.dll と php_sqlsrv_54_ts.dll を使用しています。そのSQLサーバー2005.

問題は、特定の SQL サーバー ストアド プロシージャを実行すると、cakephp が何も実行しないことです。SQL プロファイラーで、ストアド プロシージャ コールの構文が正しく、すべてのパラメーターが正しいことを確認できます。また、このストアド プロシージャが SQL サーバーで完全に正常に動作していることもプロファイラーで確認できます。しかし、cakephp には何も表示されません。

対応する MySql ルーチンは正常に動作し、cakephp は正しいデータを返します。

これは、ストアド プロシージャが後に続く php コードです。

    $getCoulmnsInfo =$this->Maintable->query('exec GetColumns_Information 0');          

    print_r($getCoulmnsInfo); // This prints nothing, $getCoulmnsInfo is empty

対応する SQL サーバーのストアド プロシージャは次のとおりです。

    ALTER PROCEDURE [dbo].[GetColumns_Information]
    @GroupOverride midsys_boolean AS
    IF ( @GroupOverride = 1 )
    BEGIN SELECT columns_id, columns_columntypesid, columns_columnname,    
    columns_usercolumnname, 1 FROM ColumnsTable ORDER BY columns_id RETURN END

    SELECT columns_id, columns_columntypesid, columns_columnname,         
    columns_usercolumnname, columns_columnsettings
    FROM ColumnsTable
    ORDER BY columns_id

ここで、上記を以下のように変更すると、正常に動作し、適切な結果が返されます。基本的に、途中の数行を削除しました。

    ALTER PROCEDURE [dbo].[GetColumns_Information]
    @GroupOverride midsys_boolean AS

    SELECT columns_id, columns_columntypesid, columns_columnname,         
    columns_usercolumnname, columns_columnsettings
    FROM ColumnsTable
    ORDER BY columns_id

動作していないストアド プロシージャの別の例。

    ALTER PROCEDURE [dbo].[MainStatusesFlow_Next]
    @MainID int AS
    DECLARE @MainStatusesID int

    SELECT @MainStatusesID = main_mainstatusesid
    FROM MainTable
    WHERE main_id = @MainID

    IF EXISTS ( SELECT * FROM MainStatusesTable MainStatuses INNER JOIN         
    MainStatusesFlowTable MainStatusesFlow ON MainStatuses.mainstatuses_id =         
    MainStatusesFlow.mainstatusesflow_nextstatusid WHERE         
    MainStatusesFlow.mainstatusesflow_statusid = 10 )
    BEGIN SELECT MainStatuses.mainstatuses_name FROM MainStatusesTable MainStatuses         
    INNER JOIN MainStatusesFlowTable MainStatusesFlow ON MainStatuses.mainstatuses_id =         
    MainStatusesFlow.mainstatusesflow_nextstatusid WHERE         
    MainStatusesFlow.mainstatusesflow_statusid = 10 RETURN END

    SELECT mainstatuses_name, 1
    FROM MainStatusesTable
    WHERE mainstatuses_id = 10

ここでも、中央部分を削除すると機能します。

残りのストアド プロシージャは問題なく動作しています。

どんな助けでも大歓迎です。

乾杯

4

2 に答える 2

0

あなたの問題は、複数のレコードセットと、ドライバーがそれらの送信を処理する方法 (または潜在的にそれを処理する方法) に関係していると思います。

ストアド プロシージャの 1 つをこれに変更してみてください。

ALTER PROCEDURE [dbo].[GetColumns_Information]
@GroupOverride midsys_boolean AS
IF ( @GroupOverride = 1 )
BEGIN 
SELECT columns_id, columns_columntypesid, columns_columnname,    
columns_usercolumnname, 1 AS 'columns_columnsettings'
FROM ColumnsTable 
ORDER BY columns_id
END

ELSE
BEGIN
SELECT columns_id, columns_columntypesid, columns_columnname,         
columns_usercolumnname, columns_columnsettings
FROM ColumnsTable
ORDER BY columns_id
END

この場合、1 つのレコードセットに単純化できます。

SELECT columns_id, columns_columntypesid, columns_columnname,    
columns_usercolumnname,
CASE
WHEN @GroupOverride = 1 THEN 1
ELSE columns_columnsettings
END AS 'columns_columnsettings'
FROM ColumnsTable 
ORDER BY columns_id

幸運を祈ります

于 2013-07-30T13:32:18.597 に答える