Azure SQL数据库:"未选择任何列"使用Dapper

时间:2016-01-28 23:55:47

标签: azure stored-procedures azure-sql-database 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();
}

真的很直白。我工作正常,但是当存储过程没有返回任何结果时我得到了

  

&#39; System.InvalidOperationException&#39;在Dapper.dll中,&#34;没有选择任何列&#34;

调用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(),结果相同。

有什么问题?提前致谢

1 个答案:

答案 0 :(得分:2)

原来我的SP中有bug,Dapper代码很好。 SP实际上有点复杂(有一些嵌套的IF-THEN-ELSE),当没有记录匹配条件时它没有做任何事情,没有返回任何东西而可怜的Dapper不知道如何将其映射到DTO - 因此例外。咄!傻我!记录以防其他人有类似案件。