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






4.80/5 (54投票s)
2021年4月20日
2分钟阅读

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 日:初始发布