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;

            }

        }

    }



}


你可能感兴趣的:(Access)