Obtenir la valeur de retour de la procédure stockée dans ADO.NET
Je sais qu'il y a une autre question avec presque le même titre, mais cela ne répond pas à ma question.
J'ai une procédure stockée qui retourne l'identifiant unique après l'insertion (@@identity). Je l'ai essayé dans l'explorateur de serveurs et qu'il fonctionne comme prévu (@RETURN_VALUE = [identifiant]).
Dans mon code j'ai ajouté un paramètre appelé "@RETURN_VALUE", avec ReturnValue sens premier, que tous les autres paramètres, mais whene j'exécute ma requête avec la méthode ExecuteNonQuery() ce paramètre demeure vide. Je ne sais pas ce que j'ai fait de mal.
Ma procédure stockée:
ALTER PROCEDURE dbo.SetAuction
(
@auctionID int,
@itemID int,
@auctionType tinyint,
@reservationPrice int,
@maxPrice int,
@auctionEnd datetime,
@auctionStart datetime,
@auctionTTL tinyint,
@itemName nchar(50),
@itemDescription nvarchar(MAX),
@categoryID tinyint,
@categoryName nchar(50)
) AS
IF @auctionID <> 0
BEGIN
BEGIN TRAN T1
UPDATE Auction
SET AuctionType = @auctionType,
ReservationPrice = @reservationPrice,
MaxPrice = @maxPrice,
AuctionEnd = @auctionEnd,
AuctionStart = @auctionStart,
AuctionTTL = @auctionTTL
WHERE AuctionID = @auctionID;
UPDATE Item
SET
ItemName = @itemName,
ItemDescription = @itemDescription
WHERE
ItemID = (SELECT ItemID FROM Auction WHERE AuctionID = @auctionID);
COMMIT TRAN T1
RETURN @auctionID
END
ELSE
BEGIN
BEGIN TRAN T1
INSERT INTO Item(ItemName, ItemDescription, CategoryID)
VALUES(@itemName, @itemDescription, @categoryID);
INSERT INTO Auction(ItemID, AuctionType, ReservationPrice, MaxPrice, AuctionEnd, AuctionStart, AuctionTTL)
VALUES(@@IDENTITY,@auctionType,@reservationPrice,@maxPrice,@auctionEnd,@auctionStart,@auctionTTL);
COMMIT TRAN T1
RETURN @@IDENTITY
END
Et mon code est:
cmd.CommandText = cmdText;
SqlParameter retval = new SqlParameter("@RETURN_VALUE", System.Data.SqlDbType.Int);
retval.Direction = System.Data.ParameterDirection.ReturnValue;
cmd.Parameters.Add(retval);
cmd.Parameters.AddRange(parameters);
cmd.Connection = connection;
connection.Open();
cmd.ExecuteNonQuery();
return (int)cmd.Parameters["@RETURN_VALUE"].Value;
source d'informationauteur WebMonster
Vous devez vous connecter pour publier un commentaire.
Juste essayé sur ma boîte, et cela fonctionne pour moi:
Dans SQL Server:
En C#
J'ai résolu le problème:
vous devez définir
SqlCommand.CommandType
àCommandType.StoredProcedure
afin d'obtenir les valeurs de retour et/ou des paramètres de sortie. Je n'ai trouvé aucune documentation sur le sujet, mais maintenant tout fonctionne.Vous obtenez la valeur de vos
EXEC
en TSQL? Je me demande si le refactoring, la TSQL permettrait (et à l'aide deSCOPE_IDENTITY()
:donc changer:
:
(Je changerais aussi les autres
@@IDENTITY
àSCOPE_IDENTITY()
)Comme un mineur est de l'optimisation, vous pouvez également utiliser:
mais ce côté des choses devrait ont travaillé "comme c'est" à partir de ce que je vois (c'est pourquoi je me concentre sur le TSQL).
On peut également utiliser cette simple et court méthode de calcul de la valeur de retour de SP
En SQL:
Sql Server renvoie toujours la valeur de type Int.
et en C#
Vous pouvez aussi vérifier que votre valeur de retour dans SQL en utilisant cette commande:
vous pouvez utiliser standart moyens que vous utilisez avant dans des requêtes normales, mais dans la commande Sql que vous devez écrire EXEC avant de votre magasin nom de la procédure et de ne pas utiliser commandtype comme ceci :