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 数据库上执行参数化查询