2017-05-18 2 views
0

j'ai une procédure stockée de cette forme:Comment récupérer la valeur de retour de procédure stockée avec Dapper

CREATE PROCEDURE AddProduct 
    (@ProductID varchar(10), 
    @Name nvarchar(150) 
    ) 
AS 
    SET NOCOUNT ON; 

    IF EXISTS (SELECT TOP 1 ProductID FROM Products 
       WHERE ProductID = @ProductID) 
     RETURN -11 
    ELSE 
    BEGIN 
     INSERT INTO Products ([AgentID], [Name]) 
     VALUES (@AgentID, @Name) 

     RETURN @@ERROR 
    END 

Je cette C# pour appeler la procédure stockée, mais je ne peux pas sembler obtenir une forme de valeur correcte il:

var returnCode = cn.Query(
    sql: "AddProduct", 
    param: new { @ProductID = prodId, @Name = name }, 
    commandType: CommandType.StoredProcedure); 

Comment puis-je faire en sorte que la variable returnCode contiendra la valeur retournée par l'une ou l'autre RETURN -11 ou les RETURN @@ERROR lignes?

+0

http://stackoverflow.com/q/28652987/5779732, http://stackoverflow.com/q/14247081/5779732 –

Répondre

0

Pour permettre l'utilisation de l'instruction RETURN dans SQL C# devient ...

var _params = new DynamicParameters{ @ProductID = prodId, @Name = name }; 
_params.Add(
    name: "@RetVal", 
    dbType: DbType.Int32, 
    direction: ParameterDirection.ReturnValue 
    ); 
var returnCode = cn.Execute(
    sql: "AddProduct", 
    param: _params, 
    commandType: CommandType.StoredProcedure); 
return _params.Get<int>("@RetVal"); 

Ce n'est pas la mise en œuvre que j'espérais, mais cela fonctionne.

0

Je vous suggère d'utiliser SELECT pour renvoyer les valeurs de votre procédure stockée. Aussi, vous devez spécifier un type de retour sur l'appel pimpant:

RETURN -11 

devient

SELECT -11 

et l'appel pimpant devient:

var returnCode = cn.Query<int>(.. 

J'ai mis en œuvre ce modèle plusieurs fois et il fonctionne comme prévu.