VB.NET用ADOX创建.accdb数据库时msadox28.tlb注册报错如何解决
解决方案
1 修复环境配置错误
- 移除项目中多余的
Microsoft ADO extend 2.8引用,仅保留Microsoft ADO Ext. 6.0 for DDL and Security引用即可,多个版本引用混存会导致COM实例创建冲突。 - 你此前对msadox28.tlb的注册操作是错误的:regasm仅用于注册.NET程序集,tlb是COM类型库不需要使用regasm注册,此前注册msadox.dll成功已经满足ADOX运行的基础要求,不用再处理类型库注册的问题。
- 确认你的Windows 10系统已安装对应架构的Microsoft Access 数据库引擎可再发行包:如果你的Office是32位版本,安装32位引擎;如果是64位Office,安装64位引擎,两者必须匹配,否则会出现COM类未注册的报错。
- 项目目标CPU不要设置为Any CPU,强制指定为和你安装的Access数据库引擎一致的架构:32位引擎选x86,64位引擎选x64,避免系统自动适配架构导致和引擎版本不匹配。
2 更换为支持ACCDB格式的连接字符串
你之前使用的Microsoft.Jet.OLEDB.4.0是老旧的Jet引擎,仅支持2003及以前版本的mdb格式,无法创建accdb文件,需要更换为ACE引擎的连接字符串,示例如下:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=你的目标路径\目标文件名.accdb;Jet OLEDB:Engine Type=6
其中Engine Type=6对应Access 2007及以上版本的accdb格式,不要和此前创建mdb用的Type=5混淆。
3 可用参考代码
Imports System.Runtime.InteropServices Imports ADOX Public Class DatabaseCreator Public Function CreateAccdb(filePath As String) As Boolean Dim cat As Catalog = Nothing Try cat = New Catalog() Dim connStr As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filePath};Jet OLEDB:Engine Type=6" cat.Create(connStr) Return True Catch ex As Exception ' 可自行添加异常日志逻辑 Return False Finally ' 必须释放COM对象,避免资源泄漏 If cat IsNot Nothing Then Marshal.ReleaseComObject(cat) End If End Try End Function End Class
补充排查
如果执行时仍提示提供程序未注册,直接重新核对Access数据库引擎的架构和项目目标CPU架构是否一致,绝大多数报错都是该原因导致。
内容的提问来源于stack exchange,提问作者Hemu
相关产品推荐
相关产品推荐

