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