Azure SQL 数据库:"No columns were selected" 使用 Dapper 调用存储过程时

Azure SQL Database: "No columns were selected" when calling a stored procedure using Dapper

我在 Azure 中有一个非常简单的存储过程 SQL 数据库:

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

我使用存储库中的 Dapper 调用它:

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();
}

真的很简单。我工作正常,但是当存储过程 returns 没有结果时,我得到了

'System.InvalidOperationException' in Dapper.dll, "No columns were selected"

调用 QueryAsync() 时出现异常。我的 DTO 也很简单:

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; }
}

我也试过QueryMultipleAsync(),结果一样。

有什么问题?提前致谢

原来是我SP的BUG,Dapper的代码就好了。 SP 实际上有点复杂(有一些嵌套的 IF-THEN-ELSE),当没有记录匹配条件时它什么都不做,什么都不做 return 可怜的 Dapper 不知道如何将其映射到 DTO - 因此是例外。呸!傻我!记录下来以防其他人有类似的情况。