2013-08-07 2 views
2

У меня есть база данных доступа, с которой я подключаюсь с OleDb. Все работает нормально с подключением и использованием, но мне нужно сделать резервную копию файла.Закрытие соединения с Access DB с OleDb

Я закрываю соединение:

public class myDbHandlerClass 
    { 

    private OleDbConnection myConnection; 
    //in reality this string gets built by properties to the class 
    //it ends up being this... 
    //Yes Jet 4.0 this is an Access 2003 database 
    private string myConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=myDatabase.mdb"; 

    public void OpenDatabase() 
    { 
     //to open the database 
     try 
     { 
     // Does a previous connection exist? 
     if ((myConnection != null) && myConnection.State != ConnectionState.Closed) return; 

     //No database connection string is specified, can't continue 
     if (string.IsNullOrEmpty(myConnectionString)) return; 

     myConnection = new OleDbConnection(myConnectionString); 
     myConnection.Open(); 

     } 
     catch (Exception ex) 
     { 
     ExTrace.WriteLineIf(TraceLog.TraceError, ExTrace.ShowException(ex)); 
     } 
    } 

    public void CloseDatabase() 
    { 
     try 
     { 
     if ((myConnection == null)) return; 

     if (myConnection.State != ConnectionState.Closed) myConnection.Dispose(); 
     myConnection = null; 
     GC.Collect(); 
     } 
     catch (Exception ex) 
     { 
     ExTrace.WriteLineIf(TraceLog.TraceError, ExTrace.ShowException(ex)); 
     } 
    } 
    } 

Исключение не выкинули, состояние соединения == закрыто, MyConnection == NULL, но файл .ldb никогда не уходит. Мой последующий код, который должен переместить файл myDatabase.mdb в «myDatabase.bak», терпит неудачу, потому что файл уже используется - моей программой.

Как я могу убедиться, что он фактически закрыт и не заблокирован.

EDIT: Я изменил код с предложениями ниже, и теперь он работает.

myConnection.Dispose(); 

И явным вызовом GC.Collect()

является то, что получил это работает.

Спасибо за помощь!

+1

Были ли вы объявлены myConnection ?? – Botonomous

+3

Шансы закрыты, но не удалены, он просто возвращается в пул соединений. – Tim

+0

Я редактировал код, чтобы включить объявление и открытие базы данных. myConnection объявляется как приватная переменная в классе. Я убедился, что есть только один экземпляр класса, поэтому должно быть только одно открытое соединение. – trashrobber

ответ

5

После myConnection.Close(); попытки вызывающей myConnection.Dispose();

как на самом деле, я считаю, .Dispose() закрывает соединение, так что простая замена .Close() с .Dispose() должен сделать трюк.

+1

Я пробовал это, и он все еще говорит, что файл заблокирован. – trashrobber

+0

На самом деле, это проблема. Я добавил GC.Collect() после удаления и теперь он работает. – trashrobber

+1

@trashrobber, вы должны установить это как свой ответ, а затем, когда сможете, принять его. – logixologist

1

Собственно, в этом и проблема. Я добавил GC.Collect() после удаления и теперь он работает. - trashrobber Aug 7 '13 at 21:14

У меня была та же проблема, и это было решение.

2

Я была такая же проблема, и это было решение:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 

и теперь он работает.

Смежные вопросы