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
Si vous pouvez afficher votre code de procédure stockée de mise à jour, cela peut nous aider à identifier le problème. –
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. –
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