如何使用C#将带密码的Access accdb数据库转换为accde格式
问题场景
现有通过Interop操作Access数据库的代码如下,用于打开带密码保护的Baseet.accdb文件:
Microsoft.Office.Interop.Access.Application AccApp = new Microsoft.Office.Interop.Access.Application(); string MyFile = Environment.CurrentDirectory + "\\Baseet.accdb"; AccApp.Visible = true; AccApp.OpenCurrentDatabase(MyFile, false, "017014A"); AccApp.RunCommand(AcCommand.acCmdAppMaximize);
需要实现两项需求:
- 仅为当前数据库启用宏内容,不将数据库所在位置添加到受信任位置列表
- 将已打开的数据库转换为
accde格式,尝试直接传入int值603调用SysCmd方法时抛出如下错误:
Cannot convert from int to Microsoft.Office.Interop.Access.AcSysCmdAction
之前尝试使用的转换代码如下:
string MyCompiledFile = Environment.CurrentDirectory + "\\Baseet.accde"; AccApp.SysCmd (603 , MyFile , MyCompiledFile);
实现方案
1. 单库临时启用宏(不修改受信任位置)
无需调整全局信任中心配置、无需添加受信任路径,仅针对当前Interop启动的独立Access实例临时修改宏安全级别即可,配置仅对当前实例生效,不会影响其他手动打开的Access文件,也不会写入系统受信任列表。
在调用OpenCurrentDatabase方法前新增如下代码:
// 仅对当前Access实例临时启用所有宏 AccApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityEnableMacros;
所有数据库操作完成、退出Access实例前,可将安全级别还原为默认值,避免后续该实例打开其他文件存在风险:
// 还原为默认的按UI配置执行宏安全规则 AccApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityByUI;
2. 修复accde转换的类型报错
你猜测的操作编码603是正确的,该值对应生成accde编译数据库的系统指令。报错原因是SysCmd方法的第一个参数要求传入AcSysCmdAction枚举类型值,不支持直接传入int原始值,只需将603显式强转为对应枚举类型即可解决报错。
另外注意转换前需确保目标路径下不存在同名accde文件,否则会触发文件占用/覆盖错误,修正后的转换代码如下:
using System.IO; // 引入IO命名空间用于文件存在判断 string MyCompiledFile = Environment.CurrentDirectory + "\\Baseet.accde"; // 预删除已存在的同名目标文件 if (File.Exists(MyCompiledFile)) { File.Delete(MyCompiledFile); } // 显式强转枚举类型解决参数类型不匹配问题 AccApp.SysCmd((AcSysCmdAction)603, MyFile, MyCompiledFile);
如果当前引用的Access Interop程序集版本较旧,AcSysCmdAction枚举中未定义603对应的成员,上述显式强转的写法依然可以正常执行,不需要升级Interop程序集。
内容的提问来源于stack exchange,提问作者Csharp Newbie
相关产品推荐
相关产品推荐

