public static class Util
{
/// <summary>
/// MBD compact method (c) 2004 Alexander Youmashev
/// !!IMPORTANT!!
/// !确保调用此方法前要压缩的数据库没有打开的连接,为防止万一,应在压缩前进行备份。
/// !!IMPORTANT!!
/// </summary>
/// <param name="connectionString">到源数据库的连接字符串,源数据库是指要压缩的数据库</param>
/// <param name="mdwfilename">目标数据库的物理文件名,含路径,目标数据库即压缩后得到的新数据库</param>
public static void CompactAccessDB(string connectionString, string mdwfilename)
{
object[] oParams;
object objJRO = null;
try
{
// 创建 Jet Replication 对象的实例
objJRO = Activator.CreateInstance(Type.GetTypeFromProgID("JRO.JetEngine"));
// 填充参数数组
// 将 "Jet OLEDB:Engine Type=5" 换成合适的值,
// 如果目标数据库是 JET4X 格式 (access 2000,2002),
// 那么可以保留现有的值
//(yes, jetengine5 is for JET4X, no misprint here)
string tmpPath = mdwfilename.Substring(0, mdwfilename.LastIndexOf("\\"));
tmpPath += "\\" + "tempdb.mdb";
string destConStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Jet OLEDB:Engine Type=5", tmpPath);
oParams = new object[] { connectionString, destConStr };
// 调用 JRO 对象的压缩方法,并传递参数数组
objJRO.GetType().InvokeMember("CompactDatabase",
System.Reflection.BindingFlags.InvokeMethod,
null,
objJRO,
oParams);
// 数据库已被压缩到一个新文件:C:\\tempdb.mdw
// 现在可以用这个新文件覆盖旧的数据库文件
System.IO.File.Delete(mdwfilename);
System.IO.File.Move(tmpPath, mdwfilename);
}
catch
{
throw;
}
finally
{
//clean up (just in case)
if (objJRO != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(objJRO);
objJRO = null;
}
}
}
}