Есть ли способ избежать вложенности при открытии SqlDataReader?

Ничего страшного, но ради аккуратности есть ли способ "создать и открыть" SqlConnection?

Я наивно написал этот код:

using (var strConnection = new SqlConnection(sourceConnection))
using (var strCommand = new SqlCommand(query, strConnection))
using (var reader = strCommand.ExecuteReader())
{
    ...
}

Что, конечно, не удается в строке 3, потому что соединение не открыто.
Есть ли аккуратный способ избежать вложенности, которую открывает открытие соединения?

using (var strConnection = new SqlConnection(sourceConnection))
{
    strConnection.Open();
    using (var strCommand = new SqlCommand(query, strConnection))
    using (var reader = strCommand.ExecuteReader())
    {
        ...
    }
}

2 ответа

Решение

Хороший вопрос, моя идея - это метод расширения для SqlConnection,

Проверь это:

public static class SqlExtensions {
    public static SqlConnection OpenAndReturn(this SqlConnection con) {
        try {
            con.Open();
            return con;
        } catch {
            if(con != null)
                con.Dispose();
            throw;
        }
    }
}

Использование:

using(var strConnection = new SqlConnection("CONNECTION").OpenAndReturn()) 
using(var strCommand = new SqlCommand("QUERY", strConnection))
using(var reader = strCommand.ExecuteReader()) {
    //...       
}

Как насчет чего-то такого:

class SqlHelper : IDisposable
{
    public SqlHelper(string connectionString, string query) { ... }

    public SqlConnection Connection { get; set; }
    public SqlCommand Command { get; set; }

    // SQL querying logic here
    public void Execute() { ... }

    /** IDisposable implementation **/
}

и в вашем коде

using (SqlHelper sql = new SqlHelper(sourceConnection, query)) 
{
    var reader = sql.Execute();
    ...
}
Другие вопросы по тегам