использование на SQLDataReader

Я знаю, что задал связанный вопрос ранее. У меня просто была другая мысль.

using (SqlConnection conn = new SqlConnection('blah blah'))
{
    using(SqlCommand cmd = new SqlCommand(sqlStatement, conn))
    {
        conn.open();

        // *** do I need to put this in using as well? ***
        SqlDataReader dr = cmd.ExecuteReader() 
        {
            While(dr.Read())
            {
                //read here
            }
        }
    }
}

Аргумент то, что: Начиная с SqlDataReader dr объект НЕ является НОВЫМ ОБЪЕКТОМ КАК соединение или объекты команды, просто ссылка, указывающая cmd.ExecuteReader() метод, сделайте я должен вставить читателя a using. (Теперь на основе моего предыдущего сообщения, именно мое понимание, что любой объект использует IDisposable потребности, которые будут помещены в a using, и SQLDataReader наследовался IDisposable, таким образом, я должен поместить его. Я корректен в своем решении?) Я просто смущен начиная с не новый объект, это вызвало бы какие-либо проблемы в расположении объекта, который просто является ссылочным указателем на команду?

Большое спасибо

11
задан davmos 20 August 2014 в 15:13
поделиться

2 ответа

Думаю, вы ошибаетесь. dr - это ссылка на объект, возвращаемый cmd.ExecuteReader , который будет новым объектом. В вашем примере ничего не удастся удалить dr , поэтому да, он должен быть в с использованием или удален вручную.

Ваше мнение о IDisposable разработчиках , которым требуется, чтобы находился в с использованием , неверно. Они будут нормально работать снаружи. Оператор using - это просто синтаксический сахар для try ... finally . Вещи, реализующие IDisposable , должны иметь вызов Dispose , потому что они сигнализируют о том, что им необходимо удалить определенное состояние детерминированным способом.

Обратите внимание: если вы не вызываете Dispose , это не всегда проблема. Некоторые объекты также реализуют финализатор, который запускается сборщиком мусора. Если они не реализуют финализатор, они могут оставить неуправляемую память невосстановленной. Он останется невостребованным, пока ваше приложение не закроется. В конечном итоге вся управляемая память восстанавливается, если она не пригодна для сборки мусора.

Переписано:

using (SqlConnection conn = new SqlConnection('blah blah')) 
using(SqlCommand cmd = new SqlCommand(sqlStatement, conn)) 
{
   conn.open(); 
   using (SqlDataReader dr = cmd.ExecuteReader())
   { 
        while (dr.Read()) 
        { 
           //read here 
        } 
   } 
} 
27
ответ дан 3 December 2019 в 03:03
поделиться

Средство чтения данных следует заключить в оператор using, поскольку метод ExecuteReader создает новый экземпляр средства чтения данных, который также следует удалить.

2
ответ дан 3 December 2019 в 03:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: