繁体   English   中英

为什么Dapper QueryAsync <T> 行为与查询不同 <T> 与存储返回值?

[英]Why does Dapper QueryAsync<T> behave differently from Query<T> with sproc return values?

我有一个存储过程执行检查,并返回行或非零返回值:

CREATE PROCEDURE dbo.ConditionalGet
    @ID INT
AS
BEGIN

    -- this is a silly made up condition just to test the issue
    IF @ID % 2 = 1
    BEGIN
        RETURN -1
    END

    SELECT *
    FROM MyTable
    WHERE ID = @ID

    RETURN 0
END

我有一个使用Dapper返回结果或引发异常的C#回购类:

public class Repo
{
    public MyClass Get(int id)
    {
        using (var conn = GetSqlConnection())
        {
            var p = new { ID = id };
            var pWithReturnValue = new DynamicParameters(p);
            p.Add("return", null, DbType.Int32, ParameterDirection.ReturnValue);

            var result = conn.Query<MyClass>("dbo.ConditionalGet", p, commandType: CommandType.StoredProcedure);

            var errorCode = p.Get<int>("return");
            if (errorCode != 0)
                throw new RepositoryGetException(errorCode);

            return result.FirstOrDefault();
        }
    }
}

这可以按预期工作:当id被2整除时,将返回水合对象,否则将引发异常。

但是,当我使代码异步时,这将失败!

public class Repo
{
    public async Task<MyClass> Get(int id)
    {
        using (var conn = GetSqlConnection())
        {
            var p = new { ID = id };
            var pWithReturnValue = new DynamicParameters(p);
            p.Add("return", null, DbType.Int32, ParameterDirection.ReturnValue);
            // this is the only change!
            var result = await conn.QueryAsync<MyClass>("dbo.ConditionalGet", p, commandType: CommandType.StoredProcedure);

            var errorCode = p.Get<int>("return");
            if (errorCode != 0)
                throw new RepositoryGetException(errorCode);

            return result.FirstOrDefault();
        }
    }
}

这将引发InvalidOperationException“未选择任何列”!

我真的很喜欢这里的模式,并且想异步使用它,那为什么会失败呢? 我尝试过打开和关闭缓冲,但没有任何效果。

目前,Dapper不支持不执行SELECT语句的Async方法。
在Github中有一个开放的问题:
https://github.com/StackExchange/Dapper/issues/591

您现在要做的是:

ALTER PROCEDURE dbo.ConditionalGet
    @ID INT,
    @Output INT OUTPUT
AS
BEGIN

    -- this is a silly made up condition just to test the issue
    IF @ID % 2 = 1
    BEGIN
        SET @Output = -1
    END
    ELSE BEGIN
        SET @Output = 0
    END

    SELECT *
    FROM MyTable
    WHERE ID = @ID
END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM