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

Posted

技术标签:

【中文标题】Azure SQL 数据库:使用 Dapper 调用存储过程时“未选择任何列”【英文标题】:Azure SQL Database: "No columns were selected" when calling a stored procedure using Dapper 【发布时间】:2016-01-28 23:55:46 【问题描述】:

我在 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();

真的很简单。我工作得很好,但是当存储过程没有返回结果时,我得到了一个

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(),结果一样。

有什么问题?提前致谢

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于Azure SQL 数据库:使用 Dapper 调用存储过程时“未选择任何列”的主要内容,如果未能解决你的问题,请参考以下文章

具有相同依赖项的不同版本的 nuget 包的 azure 函数

我想使用 dapper 在 Oracle 和 SQL 数据库上执行参数化查询

将 Dapper 与 SQL Server 一起使用

如何使用 Dapper 从 SQL Server Image 字段中读取 blob 数据?

Dapper 的 SQL 查询生成器

Dapper防sql注入,同一条SQL支持多种数据库