You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将旧版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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:39:01