C# 压缩 Access 数据库

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;
            }
        }
    }

}

posted @ 2011-04-18 18:54  梦幻泡影  阅读(435)  评论(0编辑  收藏  举报