Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

OleDbConnection как закрыть и очистить пул соединений?

489
04 ноября 2009 года
NeO_u
277 / / 11.10.2006
OleDbConnection как закрыть и очистить пул соединений?
Базы данных: MS Access
Проблема в том, что мне во время работы программы, при определенных условиях необходимо чистить и сжимать БД.
Почистить БД я смог. А вот сжать...мне все время ругается на открытое соединение с БД. Хотя, при этом OleDbConnection.Close() был вызван.
Гугл дал несколько советов. Но они не помогли. Проблема осталась.
"Ole Db Service=-4" - не помогает.

Перепробовал все варианты закрытия. Ничего не помогло, пока полностью не закрою программу, соединение не закрывается.

Подскажите?

Вот, что я делаю сейчас:
 
Код:
m_dbConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb");
            m_dbConnection.Open();
- в конструкторе синглтона.

Код:
string sConn = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};", "test.mdb");
            string dbName = String.Format("{0}.mdb", DateTime.Now.ToShortDateString());
            string dConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=temp.mdb";


            try
            {
                if (!System.IO.Directory.Exists("./Backup"))
                    System.IO.Directory.CreateDirectory("./Backup");

                System.IO.File.Copy(m_dbName, String.Format("./Backup/{0}", dbName), true);

                ClearReports();

                JRO.JetEngine jro = new JRO.JetEngine();

                m_dbConnection.Close();
                m_dbConnection.Dispose();
                m_dbConnection = null;
                OleDbConnection.ReleaseObjectPool();
                GC.Collect();
                Thread.Sleep(60000);

                jro.CompactDatabase(sConn, dConn);

                System.IO.File.Move("temp.mdb", "test.mdb");

                m_dbConnection.Open();
            }
            catch
            {

                return false;
            }

            return true;
- процесс сжатия, как видно, тут используется, все что приходило в голову, и GC вызывается...идеи мои закончились, по-этому обращаюсь к вам за помощью.

jro.CompactDatabase(sConn, dConn); - вот здесь всегда ошибка, которая говорит о том, что данная БД используется кем-то еще.
5
04 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Добавьте к строке подключения Pooling=false.
11
05 ноября 2009 года
oxotnik333
2.9K / / 03.08.2007
вообще то акцесс пуллинг не поддерживает (точнее драйвер JET не поддерживает)
5
05 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: NeO_u

 
Код:
JRO.JetEngine jro = new JRO.JetEngine();

                m_dbConnection.Close();
                m_dbConnection.Dispose();
                m_dbConnection = null;
                OleDbConnection.ReleaseObjectPool();
                GC.Collect();
                Thread.Sleep(60000);

                jro.CompactDatabase(sConn, dConn);

В порядке бреда: а если создать экземпляр JetEngine после закрытия всех OleDb-подключений?

 
Код:
m_dbConnection.Close();
                m_dbConnection.Dispose();
                m_dbConnection = null;
                OleDbConnection.ReleaseObjectPool();
                GC.Collect();
                Thread.Sleep(60000);

                JRO.JetEngine jro = new JRO.JetEngine();
                jro.CompactDatabase(sConn, dConn);



Цитата: oxotnik333
вообще то акцесс пуллинг не поддерживает (точнее драйвер JET не поддерживает)

Угу.

489
06 ноября 2009 года
NeO_u
277 / / 11.10.2006
Угу. Как оказалось и вправду не поддерживает. Проблема была в самом коде. Как оказалось JET не проверяет был ли закрыт OleDBReader или уничтожен объект OleDbCommand. Соответственно, при криво написанном коде, при закрытии OleDbConnection фактически соединение не закрывается, т.к. есть не закрытые OleDbReader. Отсюда вся и проблема. Пришлось переписать часть комманд и все заработало.
5
06 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: NeO_u
Как оказалось JET не проверяет был ли закрыт OleDBReader или уничтожен объект OleDbCommand.

Мило :D

489
06 ноября 2009 года
NeO_u
277 / / 11.10.2006
Цитата: hardcase
Мило :D



Согласен :)

11
06 ноября 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: NeO_u
Проблема была в самом коде. Как оказалось JET не проверяет был ли закрыт OleDBReader или уничтожен объект OleDbCommand.


а они на разных коннектах висели?

489
06 ноября 2009 года
NeO_u
277 / / 11.10.2006
Цитата: oxotnik333
а они на разных коннектах висели?



Нет, естественно. Я уже писал. Класс синглтон :) Один коннект и куча команд.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог