2014-09-22 4 views
-1

Я создаю простой класс, но получаю Cannot convert Task object to Task SqlDataReader. Вот мой код,Невозможно преобразовать объект задачи в задачу 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(); 
      } 
     } 
    }   
} 

Любое предложение исправить эту проблему будет оценено по достоинству?

+0

Нет такого сообщения об ошибке. Пожалуйста, сообщите точную ошибку/исключение компилятора и скажите, где это произошло, и что вы сделали, чтобы решить эту проблему. Опубликовать меньше кода. – usr

+1

Обратите также внимание на то, что 'ExecuteScalarAsync' не должен быть' async' здесь: он просто возвращает исходную 'Task '. –

ответ

4

Вы не можете наложить 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)

Примечание: Вы также можете использовать ConfigureAwait(false) на всех ваших await выражений. Например:

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); 
} 
+0

Спасибо. Он немедленно вернется к вызывающему абоненту? – user960567

+1

@ user960567, который зависит от * множества вещей; но в случае * типичного *, он возвратит неполную задачу вызывающему абоненту после его обработки ADO.NET - точно так же, как при использовании ADO.NET напрямую. –

+0

Спасибо. В качестве дополнительной заметки, это замена microsoft SqlHelper, которую использует мое приложение (только добавленные необходимые методы). Вы видите какую-либо проблему в коде? – user960567

Смежные вопросы