Base de datos SQL Azure: "No se seleccionaron columnas" al llamar a un procedimiento almacenado utilizando Dapper

azure azure-sql-database dapper stored-procedures

Pregunta

Tengo un procedimiento almacenado realmente simple en la base de datos SQL de Azure:

CREATE PROCEDURE dbo.spfindPartialIdentity 
    @ClientId nvarchar(50),
    @ExternalId nvarchar(250)
AS BEGIN
   SET NOCOUNT ON;

   SELECT 
       ClientId, ExternalId 
   FROM 
       [dbo].[PartialIdentities] 
   WHERE 
       ClientId = @ClientId AND ExternalId = @ExternalId
END

y lo invoco usando Dapper desde mi repositorio:

using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ReportingDB"].ConnectionString))
{
    await conn.OpenAsync();
    var res = await conn.QueryAsync<PartialIdentity>("dbo.spfindPartialIdentity", 
                                                      new { ClientId = clientId, ExternalId = externalId }, 
                                                      commandType: CommandType.StoredProcedure, 
                                                      commandTimeout: GetCommandTimeout());

    return res.ToList();
}

Muy sencillo. Funciono bien, PERO cuando el procedimiento almacenado no arroja resultados obtuve un

'System.InvalidOperationException' en Dapper.dll, "No se seleccionaron columnas"

excepción cuando se llama a QueryAsync() . Mi DTO es realmente simple también:

public class PartialIdentity
{
    public PartialIdentity(string clientId, string externalId)
    {
        this.ClientId = clientId;
        this.ExternalId = externalId;
    }

    public string ClientId { get; set; }
    public string ExternalId { get; set; }
}

También intenté QueryMultipleAsync() , el mismo resultado.

¿Cuál es el problema? Gracias por adelantado

Respuesta aceptada

Resultó ser un error en mi SP, el código Dapper estaba bien. El SP era en realidad un poco más complejo (con un IF-THEN-ELSE anidado), y cuando ningún registro coincidía con la condición, no hacía nada, no devolvía nada y el pobre Dapper no sabía cómo asignar eso al DTO: de ahí la excepción. Duh! ¡Tonto de mí! Documentando eso en caso de que alguien más tenga un caso similar.



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é