无法将任务对象转换为任务SqlDataReader

本文关键字:任务 SqlDataReader 转换 对象 | 更新日期: 2023-09-27 18:23:57

我正在创建一个简单的类,但我得到了Cannot convert Task object to Task SqlDataReader。这是我的代码,

public static class SqlHelper
{
    enum ExecutionType
    {
        NonQuery,
        Reader,
        Scaler
    }
    public static async Task<int> ExecuteNonQueryAsync(string connectionString, CommandType commandType,
        string commandText,
        params SqlParameter[] parameters)
    {
        return (Task<int>)ExecuteAsync(ExecutionType.NonQuery, connectionString, commandType, commandText, parameters);
    }

    public static async Task<SqlDataReader> ExecuteReaderAsync(string connectionString, CommandType commandType,
        string commandText, params SqlParameter[] parameters)
    {
        return (Task<SqlDataReader>)ExecuteAsync(ExecutionType.Reader, connectionString, commandType, commandText, parameters);
    }
    public static async Task<object> ExecuteScalarAsync(string connectionString, CommandType commandType, string commandText,
        params SqlParameter[] parameters)
    {
        return ExecuteAsync(ExecutionType.Scaler, connectionString, commandType, commandText, parameters);
    }

    private static async Task<object> ExecuteAsync(ExecutionType executionType, string connectionString, CommandType commandType, string commandText,
        params SqlParameter[] parameters)
    {
        using (var connection = new SqlConnection(connectionString))
        {
            using (var command = new SqlCommand(commandText, connection) { CommandType = commandType })
            {
                command.Parameters.AddRange(parameters);
                await connection.OpenAsync();
                if (executionType == ExecutionType.Reader)
                {
                    return await command.ExecuteReaderAsync();
                }
                if (executionType == ExecutionType.NonQuery)
                {
                    return await command.ExecuteNonQueryAsync();
                }
                return await command.ExecuteScalarAsync();
            }
        }
    }        
}

如有任何解决此问题的建议,我们将不胜感激?

无法将任务对象转换为任务SqlDataReader

不能将Task<object>强制转换为Task<Foo>。你想要的是:

return (Foo) await (expression);

public static async Task<SqlDataReader> ExecuteReaderAsync(
    string connectionString, CommandType commandType,
    string commandText, params SqlParameter[] parameters)
{
    return (SqlDataReader) await ExecuteAsync(ExecutionType.Reader,
        connectionString, commandType, commandText, parameters);
}

(对于int版本也是如此)

注意:您可能还想在所有await表达式上使用ConfigureAwait(false)。例如:

public static async Task<int> ExecuteNonQueryAsync(string connectionString,
    CommandType commandType, string commandText, params SqlParameter[] parameters)
{
    return (int) await ExecuteAsync(ExecutionType.NonQuery, connectionString,
        commandType, commandText, parameters).ConfigureAwait(false);
}