m_dbConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb");
m_dbConnection.Open();
OleDbConnection как закрыть и очистить пул соединений?
Базы данных: MS Access
Проблема в том, что мне во время работы программы, при определенных условиях необходимо чистить и сжимать БД.
Почистить БД я смог. А вот сжать...мне все время ругается на открытое соединение с БД. Хотя, при этом OleDbConnection.Close() был вызван.
Гугл дал несколько советов. Но они не помогли. Проблема осталась.
"Ole Db Service=-4" - не помогает.
Перепробовал все варианты закрытия. Ничего не помогло, пока полностью не закрою программу, соединение не закрывается.
Подскажите?
Вот, что я делаю сейчас:
Код:
Код:
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;
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;
jro.CompactDatabase(sConn, dConn); - вот здесь всегда ошибка, которая говорит о том, что данная БД используется кем-то еще.
Добавьте к строке подключения Pooling=false.
вообще то акцесс пуллинг не поддерживает (точнее драйвер JET не поддерживает)
Цитата: 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);
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);
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 не поддерживает)
Угу.
Угу. Как оказалось и вправду не поддерживает. Проблема была в самом коде. Как оказалось JET не проверяет был ли закрыт OleDBReader или уничтожен объект OleDbCommand. Соответственно, при криво написанном коде, при закрытии OleDbConnection фактически соединение не закрывается, т.к. есть не закрытые OleDbReader. Отсюда вся и проблема. Пришлось переписать часть комманд и все заработало.
Цитата: NeO_u
Как оказалось JET не проверяет был ли закрыт OleDBReader или уничтожен объект OleDbCommand.
Мило :D
Цитата: hardcase
Мило :D
Согласен :)
Цитата: NeO_u
Проблема была в самом коде. Как оказалось JET не проверяет был ли закрыт OleDBReader или уничтожен объект OleDbCommand.
а они на разных коннектах висели?
Цитата: oxotnik333
а они на разных коннектах висели?
Нет, естественно. Я уже писал. Класс синглтон :) Один коннект и куча команд.