используя на SQLDataReader - PullRequest
       34

используя на SQLDataReader

11 голосов
/ 02 августа 2010

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

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(), нужно ли помещать читатель в using. (Теперь, основываясь на моем предыдущем посте, я понимаю, что любой объект, который использует IDisposable, должен быть помещен в using, а SQLDataReader наследуется от IDisposable, поэтому мне нужно его поставить. по моему мнению?) Я просто сбит с толку, так как это не новый объект, не вызовет ли это каких-либо проблем с удалением объекта, который просто является ссылочным указателем на команду?

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

Ответы [ 2 ]

27 голосов
/ 02 августа 2010

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

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

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

написано Re-:

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 
        } 
   } 
} 
2 голосов
/ 02 августа 2010

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

...