代码之家  ›  专栏  ›  技术社区  ›  santosh kumar patro

无法将类型“System.Threading.Tasks.Task<System.Data.Common.DbDataReader>”转换为“System.Threadion.Tasks.Task<System.Data.IDataReader>'”

  •  0
  • santosh kumar patro  · 技术社区  · 1 年前

    我在C#中遇到了以下代码的几个问题。

    1. 我有一个异步方法,它执行SQL查询并返回一个Task,但当试图返回另一个返回Task<System.Data.Common.DbDataReader>。

    代码片段如下:

    public Task<IDataReader> ExecuteReaderAsync(string? sql, object? param = null, IDbTransaction? transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken? cancellationToken = null)
        => ExecuteWithResiliency((s, p, c) => c.ExecuteReaderAsync(s, p, transaction, commandTimeout, commandType), sql, param);    
    
    private async Task<T> ExecuteWithResiliency<T>(Func<string, object, SqlConnection, Task<T>> connectionFunc, string sql, object param = null, [CallerMemberName] string operation = "")
    {
        return await _resiliencyPolicy.ExecuteAsync(
            ctx => connectionFunc(sql, param, (SqlConnection)_connection),
            ContextHelper.NewContext((SqlConnection)_connection, _logger, sql, param, operation));
    }
    

    问题出现在ExecuteReaderAsync方法中,我正试图调用ExecuteWithResiliency方法来执行SQL查询并返回Task。但是,它给出了以下错误:

    Cannot implicitly convert type 'System.Threading.Tasks.Task<System.Data.Common.DbDataReader>' to 'System.Threading.Tasks.Task<System.Data.IDataReader>'.
    

    我知道ExecuteWithResiliency方法是通用的,这允许它与返回不同类型的各种异步方法一起工作。但是,System.Data.Common.DbDataReader和System.Data.IDataReader之间似乎不兼容。

    如何修改代码以解决此问题并使其正确工作,同时保留ExecuteWithResiliency方法的通用性质?

    1. 无法从“Dapper.CommandDefinition?”转换到“字符串”

    公共异步任务<IReadOnlyList>QueryAsync(CommandDefinition?命令,CancellationToken?CancellationToken=null)=>(等待具有弹性的执行((s,p,c)=>c.QueryAsync(命令))。AsList();

    如果您对如何处理这种情况有任何见解或建议,我们将不胜感激。

    有人能在这里为我提供指导吗

    1 回复  |  直到 1 年前
        1
  •  2
  •   Guru Stron    1 年前

    System.Data.Common.DbDataReader System.Data.IDataReader 这样你就可以 await 这个 ExecuteWithResiliency :

    public async Task<IDataReader> ExecuteReaderAsync(string? sql, object? param = null, IDbTransaction? transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken? cancellationToken = null)
        => await ExecuteWithResiliency((s, p, c) => c.ExecuteReaderAsync(s, p, transaction, commandTimeout, commandType), sql, param);