Sé que hay otra pregunta con casi el mismo título, pero no responde mi pregunta. Tengo un procedimiento almacenado, que devuelve el identificador único después de la inserción (@@ identidad). Lo probé en el explorador del servidor y funciona como se esperaba (@RETURN_VALUE = [identificador]). En mi código, agregué un parámetro llamado "@RETURN_VALUE", con la dirección ReturnValue primero, que cualquier otro parámetro, pero cuando ejecuto mi consulta con ExecuteNonQuery() ese parámetro permanece vacío. No sé lo que hice mal. Mi sproc:Obtener el valor de retorno del procedimiento almacenado en ADO.NET
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
Y mi código es:
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;
Cuando dices 'vacío', ¿recibes una excepción que dice que el 'Valor' es nulo? (El elenco fallará si es nulo). ¿O es 0? –
Su valor es 0. – WebMonster
BTW, '@@ IDENTITY' es peligroso; deberías usar 'SCOPE_IDENTITY()' en su lugar. –