// How To Compact Microsoft Access Database Through ADO
// http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q230501
public bool CompressMdb(string path)
{
string temp1="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\""+path+"\";";
string file =Path.GetTempFileName(); // файл для временной БД
string temp2="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\""+file+"\";";
object je=null; // объект JRO.JetEngine
bool ok=true; // код завершения сжатия БД
try
{ //создать Microsoft Jet Replication Object
Type tj=Type.GetTypeFromProgID("JRO.JetEngine");
je=Activator.CreateInstance(tj);
OleDbConnection.ReleaseObjectPool();
if(File.Exists(file)) File.Delete(file); // удалить временный файл, созданный GetTempFileName();
// сжать базу данных -> и копировать ее во временный файл
tj.InvokeMember("CompactDatabase", BindingFlags.InvokeMethod, null, je, new object[]{temp1, temp2});
// вот здесь нужно очень аккуратно:
temp1=path+".bak"; // имя резервной копии БД
if(File.Exists(temp1)) File.Delete(temp1);
File.Move(path, temp1); // делаем резервную копию БД (переименование файла без копирования)
File.Move(file, path); // копировать сжатую/временную БД
if(File.Exists(temp1)) File.Delete(temp1);
}
catch(Exception ex)
{ /* обработка ошибок */
ok=false; // облом
}
finally
{ if(je!=null) Marshal.ReleaseComObject(je);
je=null;
}
return(ok);
} |