La ejecución de IDbConnection.Query da una excepción: la conversión falló al convertir el valor nvarchar 'Memory to data type int'

asp.net-core-2.0 c# dapper sql tsql

Pregunta

Hace poco realicé un procedimiento Almacenado en Azure para mi aplicación web. Yo uso ASP.net core 2.0 para hacerlo. En el procedimiento almacenado, quiero obtener un tipo de componente de PC específico, por ejemplo: "Placa base". Después de eso, quiero devolver ese tipo a mi aplicación.

Este es mi procedimiento almacenado

CREATE PROCEDURE GetCurrentType 
@BuildID INT = 1, 
@t NVARCHAR(128) OUTPUT,
@Index INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @Index = COUNT(*) 
    FROM Partslist 
    WHERE buildId = @BuildID;

    SELECT @t = _Type 
    FROM ComponentTypes 
    WHERE PriorityID = @Index;

    RETURN @t
END

El procedimiento almacenado cuenta todas las partes ya seleccionadas que el usuario ha elegido. Con ese número, busca el siguiente tipo en la tabla ComponentTypes para que el usuario pueda elegir. Este tipo será devuelto. El BuildID necesita ser 1 por ahora pero luego lo cambiaré para que sea un parámetro real.

C # code:

IEnumerable<string> test = db.Query<string>
(
      "GetCurrentType",
      new {BuildID = 1, t = "", Index = 0}, 
      commandType: CommandType.StoredProcedure
);

Esto debería obtener el tipo y establecerlo en la prueba IEnumerable. Pero cuando lo ejecuto, aparece el siguiente error:

System.Data.SqlClient.SqlException: 'Error de conversión al convertir el valor nvarchar' Memoria 'a tipo de datos int.'

También traté de usar un DynamicParameters pero eso me dio el mismo error. Lo realmente extraño es que no tengo una tabla o columna de memoria en mi base de datos.

Respuesta aceptada

@t NVARCHAR(128) OUTPUT,

y

RETURN @t

El valor de RETURN es siempre numérico; de RETURN :

Sintaxis

RETURN [ integer_expression ]

Argumentos

integer_expression

Es el valor entero que se devuelve. Los procedimientos almacenados pueden devolver un valor entero a un procedimiento de llamada o una aplicación.

Tipos de devolución

Opcionalmente devuelve int .

Básicamente: no RETURN esto. O SELECT , o use un parámetro OUTPUT .

Mi recomendación sería SELECT .



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é