MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как выполнить Сжатие и восстановление Access базы через Interop?"
Answer 848255
Вызов
app.CurrentDb().Name
создает управляемую обертку COM-объектаdao.Database
, ссылка на которую нигде не сохраняется, так что ее никак нельзя впоследствии освободить, кроме как финализатором. Из-за этого программа держит базу даже после вызововapp.CloseCurrentDatabase()
иMarshal.ReleaseComObject
на втором экземпляре объекта. ВызовGC.Collect()
не помогает, так как финализатор выполняется не сразу, а только через некоторое время.Чтобы нормально освободить базу, нужно избавиться от создания второго экземпляра объекта (так как он не нужен):
dao.Database db = app.CurrentDb(); string pathToDb = db.Name; string pathToCompact = Path.Combine(Path.GetDirectoryName(pathToDb), Path.GetFileNameWithoutExtension(pathToDb)) + "_compact" + Path.GetExtension(pathToDb); app.CloseCurrentDatabase(); Marshal.ReleaseComObject(db); app.CompactRepair(pathToDb, pathToCompact, true);
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.