insertar desde el procedimiento almacenado sql a través de dapper devuelve -1 (no "trabajando")

c# dapper sql sql-server stored-procedures

Pregunta

Tengo un procedimiento de tienda que funciona "manualmente", pero cuando se ejecuta a través de Dapper, devuelve un "-1" y no produce errores.

El sproc:

  ... PROCEDURE [ts].[uspAddClientForm](
   @ClientId int,
   @SystemFormId bigint,
   @Year int,
   @Name nvarchar(255),
   @CreatedBy nvarchar(2000),
   @CreateDate datetime = NULL,
   @Active bit = 1,
   @ClientFormId bigint OUTPUT
  )
  AS
  BEGIN
    SET NOCOUNT ON  
    INSERT INTO [ts].[ClientForm] ([ClientId], [SystemFormId], [Year] 
    ,[Name] ,[CreatedBy] ,[CreateDate], [Active]) 
    VALUES(@ClientId, @SystemFormId, @Year, @Name, @CreatedBy, GETDATE(),    @Active)

    SET @ClientFormId = SCOPE_IDENTITY() 
  END

El código relacionado con dapper:

   var formParams = new DynamicParameters();
       formParams.Add("@ClientId", clientForm.ClientId);
       formParams.Add("@SystemFormId", clientForm.SystemFormId);
       formParams.Add("@Year", clientForm.Year);
       formParams.Add("@Name", clientForm.Name);
       formParams.Add("@CreatedBy", clientForm.Username);
       formParams.Add("@CreateDate", DateTime.Now);
       formParams.Add("@Active", 1);
       formParams.Add("@ClientFormId", DbType.Int64, direction: ParameterDirection.Output);

       var result =  dbConnection.Execute("ts.uspAddClientForm", formParams, commandType: CommandType.StoredProcedure);

   // retrieve output value
   var clientId = formParams.Get<long>("@ClientFormId");

También intenté, sin éxito, eliminar el parámetro OUTPUT utilizando ExecuteScalar y Query devolviendo SCOPE_IDENTITY() en un SELECT . Preferiría usar el método OUTPUT , pero estoy abierto a todo lo que funcione y, en general, me suscribo a las mejores prácticas.

Respuesta aceptada

Puede intentar seleccionar la identidad como algo:

 SELECT SCOPE_IDENTITY() AS ClientFormId 

Y en su código de dapper: // assuming that your identity is an int .ExecuteScalar<int>("ts.uspAddClientForm", ...)

Y también elimine el parámetro de salida, ya que no lo necesitará.


Respuesta popular

Siguiendo la línea no es así, modifíquela y pruébela.

     formParams.Add("@ClientFormId", DbType.Int64, direction: ParameterDirection.Output);

A,

     formParams.Add("@ClientFormId","",dbType: DbType.Int64, direction: ParameterDirection.Output);


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué