求助:Microsoft.ACE.OLEDB.12.0未注册错误,改x86无效
问题背景
此前通过将项目CPU架构从Any改为x86可解决该驱动未注册错误,但当前方案失效,代码基于.NET 6+System.Data.OleDb 7.0.0,5天前可正常运行,现报错:
"System.InvalidOperationException: 'The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.'"
排查与修复步骤
重新确认全架构配置
仅修改项目CPU架构可能被解决方案配置覆盖:右键解决方案→属性→配置属性→配置管理器,确保活动解决方案平台和所有关联项目的平台均设置为x86,保存后重新编译运行。重装匹配版本的ACE驱动
驱动可能因系统更新或损坏失效,需安装32位版本(即使系统是64位,因为程序以x86运行):- 下载32位的Microsoft Access Database Engine 2010 Redistributable
- 若提示已安装更高版本,以管理员身份打开命令提示符,执行安装包路径+
/passive参数(如AccessDatabaseEngine.exe /passive)完成被动安装。
规避OneDrive路径影响
代码存储在OneDrive,可能因同步锁或权限限制导致数据库访问异常:将数据库文件复制到非OneDrive本地目录(如C:/Users/kiera/Documents/),修改ConnectionString中的数据源路径后测试。重置NuGet包缓存
即使未修改OleDb版本,缓存损坏可能引发兼容性问题:右键项目→管理NuGet程序包→已安装→卸载System.Data.OleDb,清理NuGet缓存(工具→NuGet包管理器→管理解决方案的NuGet程序包→设置→清除所有缓存)后重新安装该包。
代码优化建议(额外)
当前INSERT语句存在严重SQL注入风险,需改用参数化查询:
private void btnAdd_Click(object sender, EventArgs e) { string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:/Users/kiera/Documents/dbNumber2.accdb"; using (OleDbConnection connection = new OleDbConnection(connectionString)) { connection.Open(); string encryptUser = EncryptString(tbUsername.Text); string encryptPassword = EncryptString(tbPassword.Text); string regSQL = "INSERT INTO Users ([Username], [Password]) VALUES (@Username, @Password)"; using (OleDbCommand cmd = new OleDbCommand(regSQL, connection)) { cmd.Parameters.AddWithValue("@Username", encryptUser); cmd.Parameters.AddWithValue("@Password", encryptPassword); cmd.ExecuteNonQuery(); } } }
使用using语句可确保连接自动释放,避免因异常导致连接未关闭的问题。
内容的提问来源于stack exchange,提问作者Kieran

