我在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()
,结果相同。
有什么问题?提前致谢
答案 0 :(得分:2)
原来我的SP中有bug,Dapper代码很好。 SP实际上有点复杂(有一些嵌套的IF-THEN-ELSE),当没有记录匹配条件时它没有做任何事情,没有返回任何东西而可怜的Dapper不知道如何将其映射到DTO - 因此例外。咄!傻我!记录以防其他人有类似案件。