如何将旧版mdb数据库导入C# DataTable的实现问题咨询
C# 读取老旧MDB数据库全表至DataTable解决方案
1. 需安装的NuGet包
仅需安装微软官方提供的OleDb操作包即可,无需任何第三方组件:
System.Data.OleDb
你可以在VS2019的NuGet包管理器中直接搜索安装,或者通过包管理控制台执行命令:Install-Package System.Data.OleDb
2. 其他依赖项说明
- 无需额外安装独立的Access Runtime或其他软件,你当前已安装的32位Office 365已经自带兼容MDB格式的ACE驱动
- 必须将你的项目生成平台强制设置为 x86(32位),否则会出现驱动位数不匹配的报错:设置路径为 项目属性→生成→平台目标→选择x86即可
- 确保你的MDB文件路径权限正常,无进程占用锁
3. 完整实现代码
引用命名空间
using System; using System.Data; using System.Data.OleDb;
核心读取方法
/// <summary> /// 读取MDB文件内所有用户表到DataSet中,每个DataTable对应一张表 /// </summary> /// <param name="mdbFullPath">MDB文件完整路径</param> /// <param name="dbPassword">MDB数据库密码,无密码则传空</param> /// <returns>包含所有表数据的DataSet</returns> public static DataSet ReadAllMdbTables(string mdbFullPath, string dbPassword = "") { DataSet resultDs = new DataSet(); // 构造连接字符串 string connStr = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={mdbFullPath};"; if (!string.IsNullOrWhiteSpace(dbPassword)) { connStr += $"Jet OLEDB:Database Password={dbPassword};"; } using (OleDbConnection conn = new OleDbConnection(connStr)) { try { conn.Open(); // 获取所有用户表(排除系统表) DataTable schemaDt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); // 遍历所有表逐个读取数据 foreach (DataRow row in schemaDt.Rows) { string tableName = row["TABLE_NAME"].ToString(); using (OleDbCommand cmd = new OleDbCommand($"SELECT * FROM [{tableName}]", conn)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd)) { DataTable tableDt = new DataTable(tableName); adapter.Fill(tableDt); resultDs.Tables.Add(tableDt); } } } } catch (Exception ex) { // 可根据需求自定义异常处理逻辑 throw new Exception($"读取MDB数据库失败:{ex.Message}", ex); } } return resultDs; }
调用示例
// 示例调用 string mdbPath = @"C:\test\old_data.mdb"; DataSet allTables = ReadAllMdbTables(mdbPath); // 遍历获取单张表数据 foreach (DataTable dt in allTables.Tables) { Console.WriteLine($"表名:{dt.TableName},数据行数:{dt.Rows.Count}"); }
内容的提问来源于stack exchange,提问作者Seraphim
相关产品推荐
相关产品推荐

