Azure SQL数据库:使用Dapper调用存储过程时未选择任何列存储过程、数据库、Azure、SQL

2023-09-04 01:59:05 作者:_彼岸花べ开一千年

我在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();
}
sql数据库中怎样调用带参数的存储过程

非常简单。我工作得很好,但是当存储过程没有返回任何结果时,我得到一个

Dapper.dll中的‘System.InvalidOperationException’,"未选择任何列"

调用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中的错误,Dapper代码没有问题。SP实际上稍微复杂一些(带有一些嵌套的if-Then-Else),当没有符合条件的记录时,它不执行任何操作,不返回任何内容,可怜的Dapper不知道如何将其映射到DTO-因此出现了异常。啊!我真傻!记录下来,以防其他人有类似的情况。