Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> уничтожить коннекшен 
V
    Опции темы
kobra
Дата 18.12.2006, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



здравствуите господа

написал метод возвращающи 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 
PM MAIL   Вверх
Дрон
Дата 18.12.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 5
Всего: 92



Чтобы закрыть соединение и очистить память надо вызвать
Код
__Conn.Dispose()


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

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

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



--------------------
Да. Именно так.
PM   Вверх
kobra
Дата 18.12.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



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

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


Это сообщение отредактировал(а) kobra - 18.12.2006, 12:57
PM MAIL   Вверх
Дрон
Дата 18.12.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 5
Всего: 92



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

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

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

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


--------------------
Да. Именно так.
PM   Вверх
kobra
Дата 18.12.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



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

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

PM MAIL   Вверх
Pankon
Дата 20.12.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



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

Код

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

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

 __DR.Close();


Все

Это сообщение отредактировал(а) Pankon - 20.12.2006, 11:15
PM MAIL   Вверх
kobra
Дата 20.12.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



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?
реално, в данном проекте это не актуално, но на будущее веть нужно понемать?
PM MAIL   Вверх
Дрон
Дата 20.12.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 5
Всего: 92



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

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

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

Это сообщение отредактировал(а) Дрон - 20.12.2006, 13:31


--------------------
Да. Именно так.
PM   Вверх
mr.DUDA
Дата 20.12.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Если убивать коннекшн но не команду и reader, они подберутся сборщиком мусора, ничего страшного в этом нет.


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 20.12.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



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

PM MAIL   Вверх
kobra
Дата 20.12.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



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

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

всем спосибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1181 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.