Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > уничтожить коннекшен


Автор: kobra 18.12.2006, 11:48
здравствуите господа

написал метод возвращающи dataReader,
Код
        private OleDbDataReader GetdataReader(string __ConnectionString, string __SelectText)
        {
            lock(this)
            {
                OleDbConnection __Conn = new OleDbConnection(__ConnectionString);
                OleDbCommand __Comm = new OleDbCommand(__SelectText);
                __Comm.Connection = __Conn;
                __Conn.Open();
                OleDbDataReader __DR = __Comm.ExecuteReader();
                return __DR;
            }
        }
и методы, которые им ползуются, допустим
Код
        private void button3_Click_1(object sender, EventArgs e)
        {
            string __ConnectionString = @"";
            string __SelectText = @"";
            OleDbDataReader __DR = GetdataReader(__ConnectionString, __SelectText);
            while (__DR.Read())
            {
           
            }
             __DR.Close();
        }
и задался вопросом:
так как ридер работает, значит конекшен сушествует, но если он существует, как же его уничтожить?
но в принципе, после завершения метода все локалние обьекты автоматом удаляются, но тогда как ридер работает?
я чего то не понемаю, или одно из двух smile 

Автор: Дрон 18.12.2006, 12:41
Чтобы закрыть соединение и очистить память надо вызвать
Код
__Conn.Dispose()


Цитата(kobra @  18.12.2006,  11:48 Найти цитируемый пост)
о в принципе, после завершения метода все локалние обьекты автоматом удаляются, но тогда как ридер работает?

Не совсем. Уничтожаются только те, на которые не осталось ссылок. Но DataReader как раз хранит в себе ссылку на соединение, так что оно уничтожено не будет.

PS: Что за странный стиль с двумя подчёркиваниями перед именем переменной? Первый раз такой вижу smile 

Автор: kobra 18.12.2006, 12:54
Цитата(Дрон @  18.12.2006,  12:41 Найти цитируемый пост)
PS: Что за странный стиль с двумя подчёркиваниями перед именем переменной? Первый раз такой вижу  smile  
почему то так обозначаю локалние переменние. 

Цитата(Дрон @  18.12.2006,  12:41 Найти цитируемый пост)
Чтобы закрыть соединение и очистить память надо вызватькод
Код
 __Conn.Dispose()
в том то и дело что во втором методе уже не магу добратся до конекшена и не поиму как добратся.  через __DR не получается. правда имеется мысль что после __DR.Close(); ссылка на коннекшен исчезает, значит и коннекшен станет жертвои мусорасборщика. правда не уверен что правилно мыслью.

Автор: Дрон 18.12.2006, 13:04
Цитата(kobra @  18.12.2006,  12:54 Найти цитируемый пост)
в том то и дело что во втором методе уже не магу добратся до конекшена и не поиму как добратся.

Я считаю, что вообще не стоит делать метод, возвращающий DataReader.
Пусть уж он лучше возвращает OleDbCommand, через которую ты и до Connection доберёшься, и ExecuteReader выполнишь.

Добавлено @ 13:05 
Цитата(kobra @  18.12.2006,  12:54 Найти цитируемый пост)
ссылка на коннекшен исчезает, значит и коннекшен станет жертвои мусорасборщика. правда не уверен что правилно мыслью.

Когда-нибудь да станет, но лучше (гораздо лучше) закрывать его вручную.

Автор: kobra 18.12.2006, 13:42
Цитата(Дрон @  18.12.2006,  13:04 Найти цитируемый пост)
Когда-нибудь да станет
 smile  вот меня и интересует когда. в даннои программе это не актуально, она живет всего десят минут и закрывается.

Цитата(Дрон @  18.12.2006,  13:04 Найти цитируемый пост)
Я считаю, что вообще не стоит делать метод, возвращающий DataReader.Пусть уж он лучше возвращает OleDbCommand, через которую ты и до Connection доберёшься, и ExecuteReader выполнишь.
сначало так и делал, но подобних процедур много, и разница между ними только в цикле while (__DR.Read()), и  __SelectText-е. так что решил вынести все что одинаковое.

Автор: Pankon 20.12.2006, 11:14
Цитата(kobra @  18.12.2006,  11:48 Найти цитируемый пост)
как же его уничтожить?

Код

OleDbDataReader __DR = __Comm.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

- коннект будет закрыт при 
Код

 __DR.Close();


Все

Автор: kobra 20.12.2006, 13:14
Pankon спосибо, я даже не закривал коннект.
но веть вопрос не в том, как закрыть, а втом как уничтожить (Dispose)
Код
OleDbConnection __Conn = new OleDbConnection(__ConnectionString);
                OleDbCommand __Comm = new OleDbCommand(__SelectText);
                __Comm.Connection = __Conn;
                __Conn.Open();
                OleDbDataReader __DR = __Comm.ExecuteReader();
значит создоются три обьекта __Conn, __Comm и __DR. 
__DR.Dispose() делаю, тут просто. 
но что после этого будет с __Comm и __Conn?
реално, в данном проекте это не актуално, но на будущее веть нужно понемать?

Автор: Дрон 20.12.2006, 13:28
Цитата(kobra @  20.12.2006,  13:14 Найти цитируемый пост)
но веть вопрос не в том, как закрыть, а втом как уничтожить (Dispose)

Методы Dispose и Close для Connection делают абсолютно одно и то же.
Важно вовремя закрывать соединение, а вот когда будет уничтожен .NET-овский объект мы уже контролировать не можем. И что, самое главное, нам это и не нужно smile
Распространено заблуждение о том, что Dispose в .NET -- это аналог delete в С++. Но это совершенно не верно.

А Pankon, кстати, предложил очень хорошее решение. Я-то совсем забыл о такой возможности.

Автор: mr.DUDA 20.12.2006, 13:31
Если убивать коннекшн но не команду и reader, они подберутся сборщиком мусора, ничего страшного в этом нет.

Автор: Pankon 20.12.2006, 14:44
Цитата(kobra @  20.12.2006,  13:14 Найти цитируемый пост)
вопрос не в том, как закрыть, а втом как уничтожить (Dispose)
 если тебе принципиально нужно обьект из памяти удалить, то тогда после __DR.Close(); делай System.GC.Collect(), но в большенстве случаев это и не нужно, как было сказано выше...

Автор: kobra 20.12.2006, 15:39
Цитата(Дрон @  20.12.2006,  13:28 Найти цитируемый пост)
Важно вовремя закрывать соединение, а вот когда будет уничтожен .NET-овский объект мы уже контролировать не можем.
меня волнует не то, когда будет уничтожен обьект, а то - будет ли он вообше уничтожен (естественно до закрытия программы smile )
просто я не вижу когда будут удалени ссылки на эти обьекты. асальное все ерунда smile

Добавлено @ 15:43 
все господа. понял. все понял.

всем спосибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)