使用C#连接带MDW与密码的MDB文件读取数据报错求助
场景描述
已安装SQL Server 2019和MS Access,需连接客户提供的带密码、且关联MDW工作组文件的MDB数据库,用C# OleDb连接成功,但执行查询时报错。
连接代码
string pathToMdb = @"D:\test.mdb"; string pathToMdw = @"D:\test.mdw"; string userName = "JohnAdmin"; string userPassword = "11111111"; // 原代码存在变量名错误(userLogin应为userName) string connectionString = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={pathToMdb};Jet OLEDB:System Database={pathToMdw};User ID={userName};Password={userPassword};"; OleDbConnection connection = new OleDbConnection(connectionString);
连接状态显示为已打开,但执行以下查询代码时出错:
string strSQL = "SELECT * FROM Parts"; OleDbCommand command = new OleDbCommand(strSQL, connection); OleDbDataReader reader = command.ExecuteReader(); // 报错位置 reader.Read();
错误信息
ODBC--connection to 'ODBC Driver 17 for SQL Server' failed.
补充尝试:给连接字符串添加Driver={{Microsoft Access Driver (*.mdb, *.accdb)}};时,出现错误:
找不到可安装的ISAM
错误含义
该错误说明OleDb连接在执行查询时错误地尝试调用SQL Server ODBC驱动,与当前要访问的Access MDB数据库完全不匹配,本质是驱动配置冲突、代码错误或环境兼容性问题导致的路由错误。
修复步骤
修正代码变量错误
原连接字符串中使用了未定义的userLogin变量,需替换为定义好的userName,否则实际传递的用户名为空,会触发隐性权限错误。解决Jet驱动的位数兼容性
Microsoft.Jet.OLEDB.4.0是32位专属驱动:- 若C#项目为64位编译目标,需在项目属性中切换为x86平台;
- 若必须使用64位,改用
Microsoft.ACE.OLEDB.12.0驱动(需提前安装对应位数的Access Database Engine)。
移除冲突的Driver参数
不要在OleDb连接字符串中添加Driver=参数,这是ODBC连接的写法,与OleDb的Provider=参数冲突,直接删除即可解决“找不到可安装的ISAM”错误。验证MDW权限与路径
- 确认MDW文件路径正确(建议用
@符号避免转义问题,如@"D:\test.mdw"); - 在MS Access中手动打开该MDB(通过MDW切换工作区、输入密码),确认能正常查询
Parts表,排除权限或表名拼写错误。
- 确认MDW文件路径正确(建议用
改用ACE驱动(推荐)
若Jet驱动存在兼容性问题,替换为ACE驱动的连接字符串:string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={pathToMdb};Jet OLEDB:System Database={pathToMdw};User ID={userName};Password={userPassword};";注意:需安装对应位数的Microsoft Access Database Engine 2010可再发行组件,确保与项目编译位数一致。
内容的提问来源于stack exchange,提问作者5ORBEX

