65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 和后期绑定压缩和修复 Access 数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (54投票s)

2021年4月20日

2分钟阅读

viewsIcon

336176

这段代码使用 JRO.JetEngine COM 对象从 C# 代码中压缩和修复 MS Access 数据库。绑定发生在运行时,没有引用,没有互操作。纯 System.Reflection。

引言

这段代码从 C# .NET 应用程序中压缩和修复 MS Access 数据库,无论它是一个简单的“.mdb”,还是一个“.mdw”受保护的工作组共享数据库。它执行与 MS Access 应用程序中“工具 - 数据库实用工具 - 压缩和修复数据库...”菜单项完全相同的操作。这段代码使用“后期绑定”(在运行时在内存中创建 COM 对象),因此您的项目中不需要任何烦人的互操作 COM 引用。您甚至不需要安装 MS Office。只需确保您拥有 Jet 引擎(Jet 包含在 MDAC 包中,该包随任何从 NT 4 开始的 Windows 安装一起提供)。

背景

您不喜欢 .NET 项目中的 COM 库引用吗?我认为纯 .NET 代码应该没有任何互操作、RCW 和其他引用的 COM 内容。基本上是因为 MS 库有很多不同的版本(例如,MS Office 对象库 9、10、11 等)。我们永远不知道客户端机器上安装了什么版本的 MS Office,因此我们应该通过 ProgID 而不是 CLSID 来访问 COM 对象。例如:您想确保在调用“Excel.Application”时,无论安装了什么版本的 MS Office,您都能得到 Excel。并且当您添加“MS Excel 10 对象库”引用时,您会为您的软件添加一个强限制!所以... 使用 System.Reflection 和后期绑定。

Using the Code

只需调用 CompactAccessDB 方法。此方法压缩和修复您的数据库。

参数

  • connectionString - 数据库的连接字符串
  • mdwfilename - 是您要压缩和修复的 MDB 文件的完整名称(路径+名称)

由于 Jet 的限制,该方法将您的数据库压缩到一个新文件,因此我们需要将新的压缩文件覆盖到旧文件上。

调用此方法时,请确保没有打开的数据库连接。停止您的线程。

现在,来看代码

/// <summary>
/// MBD compact method (c) 2004 Alexander Youmashev
/// !!IMPORTANT!!
/// !make sure there's no open connections
///    to your db before calling this method!
/// !!IMPORTANT!!
/// </summary>
/// <param name="connectionString">connection string to your db</param>
/// <param name="mdwfilename">FULL name
///     of an MDB file you want to compress.</param>
public static void CompactAccessDB(string connectionString, string mdwfilename)
{
    object[] oParams;

    //create an instance of a Jet Replication Object
    object objJRO = 
      Activator.CreateInstance(Type.GetTypeFromProgID("JRO.JetEngine"));

    //filling Parameters array
    //change "Jet OLEDB:Engine Type=5" to an appropriate value
    // or leave it as is if you db is JET4X format (access 2000,2002)
    //(yes, jetengine5 is for JET4X, no misprint here)
    oParams = new object[] {
        connectionString,
        "Provider=Microsoft.Jet.OLEDB.4.0;Data" + 
        " Source=C:\\tempdb.mdb;Jet OLEDB:Engine Type=5"};

    //invoke a CompactDatabase method of a JRO object
    //pass Parameters array
    objJRO.GetType().InvokeMember("CompactDatabase",
        System.Reflection.BindingFlags.InvokeMethod,
        null,
        objJRO,
        oParams);

    //database is compacted now
    //to a new file C:\\tempdb.mdw
    //let's copy it over an old one and delete it

    System.IO.File.Delete(mdwfilename);
    System.IO.File.Move("C:\\tempdb.mdb", mdwfilename);

    //clean up (just in case)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objJRO);
    objJRO=null;
}

关注点

有趣的是,Jet 引擎 5 用于 JET4X 数据库。请小心。请参阅下表

Jet OLEDB:Engine 类型 Jet x.x 格式 MDB 文件
1 JET10
2 JET11
3 JET2X
4 JET3X
5 JET4X

许可证

本文没有明确的许可证附加到它,但可能包含在文章文本或下载文件本身中的使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

历史

  • 2021 年 4 月 20 日:初始发布
© . All rights reserved.