2010-09-09 5 views
3

J'utilise le pilote SQL Server pour PHP pour se connecter à un SQL Server 2008 Express. À l'heure actuelle, j'essaie de remplacer toutes les instructions SELECT, UPDATE et INSERT par des procédures stockées. Cela fonctionne correctement pour les SP qui contiennent juste une instruction SELECT. Mais maintenant j'ai essayé d'en faire une avec une mise à jour, et je continue à recevoir le message d'erreur "Exécuter SQL directement, pas de curseur.". Je peux appeler la finesse SP à partir de Management Studio avec les mêmes valeurs de paramètre.La procédure stockée échoue lors de l'exécution Mise à jour

Des idées?

Vive Alex

EDIT: voici une procédure de mise à jour. La partie amusante est, la procédure est effectivement bien exécuté et met à jour les données comme il est censé. Mais il renvoie toujours une erreur, entraînant une exception.

D'abord, le code PHP qui échoue:

if (! $this->Result = sqlsrv_query($this->Conn, $strQuery, $arrParameters, array("Scrollable"=>SQLSRV_CURSOR_STATIC))) 
{ 
    $this->sendErrorMail($strQuery, $arrParameters); 
    throw new Exception(4001); 
} 

SQL

USE [testsite] 
GO 
/****** Object: StoredProcedure [dbo].[Items_countDownload] Script Date: 09/09/2010 18:03:28 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  Alexis Hildebrandt 
-- Create date: 2010-09-09 
-- Description: Increases the download count by 1 
-- ============================================= 
ALTER PROCEDURE [dbo].[Items_countDownload] 
    @Id INT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @DownloadCount INT = 0, @MaxCount INT = 0, @Id2 INT = 0 

    DECLARE itemCursor CURSOR SCROLL 
    FOR 
     SELECT Id, Downloads 
     FROM Items 
     WHERE Id = @Id 
     OR SKU IN 
     (
      SELECT SKU FROM Items WHERE Id = @Id 
     ) 
    FOR UPDATE OF Downloads 

    OPEN itemCursor 

    FETCH NEXT FROM itemCursor 
    INTO @Id, @DownloadCount; 

    -- Find the largest Download count across all versions of the item 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF @MaxCount < @DownloadCount 
      SET @MaxCount = @DownloadCount; 
     FETCH NEXT FROM itemCursor 
     INTO @Id, @DownloadCount; 
    END 

    -- Increase the download count by one for all versions 
    FETCH FIRST FROM itemCursor 
    INTO @Id, @DownloadCount; 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     UPDATE Items 
     SET Downloads = @MaxCount + 1 
     WHERE CURRENT OF itemCursor 
     FETCH NEXT FROM itemCursor 
     INTO @Id, @DownloadCount; 
    END 

    CLOSE itemCursor; 
    DEALLOCATE itemCursor; 
END 
+1

Si vous pouvez afficher votre code de procédure stockée de mise à jour, cela peut nous aider à identifier le problème. –

+0

Pouvez-vous décrire en mots l'objectif de ce code? Cela ressemble à quelque chose qui peut être réalisé plus efficacement avec une simple instruction 'update' plutôt qu'avec un curseur. –

+0

Salut Martin, je sais que ça a explosé. Mais il prend soin de deux choses: il compte les téléchargements d'articles et s'assure que les compteurs sont synchronisés pour différentes versions du même téléchargement. – Alexis

Répondre

0

Essayez de supprimer l'option "Scrollable"=>SQLSRV_CURSOR_STATIC de l'appel. La procédure que vous appelez ne renvoie aucun curseur ouvert au code PHP.

+0

Merci mon pote, c'est tout! – Alexis

Questions connexes