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

C#使用DataSet读取Access数据库仅获列无数据行问题排查

排查C#中DataSet读取Access数据库无数据行的问题

嘿,我来帮你捋捋这个问题!你能拿到数据表的列信息,说明数据库连接、表结构映射这部分是没问题的,读不到数据行大概率是数据没有被加载到DataSet/DataTable里,或者有其他小细节没注意到。咱们一步步来排查:

1. 核心检查:DataSet/DataTable是否真的加载了数据

你代码里直接用DataSet_TheData.TheTable,但很可能这个DataSet只是被初始化了,并没有从数据库读取数据。要知道,DataSet本身是内存中的容器,必须通过数据适配器(比如OleDbDataAdapter)执行查询并填充数据才行。

举个完整的填充示例,你可以对照着看自己的代码有没有缺这一步:

private void Button_Start_Click(object sender, EventArgs e)
{
    // 1. 先建立数据库连接(替换成你的Access连接字符串)
    string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\YourDatabase.accdb;";
    using (OleDbConnection conn = new OleDbConnection(connString))
    {
        try
        {
            conn.Open();
            // 2. 编写查询语句(先简单用SELECT *测试)
            string query = "SELECT * FROM YourTableName"; // 替换成你的表名
            OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);
            DataSet dataSet = new DataSet();
            // 3. 关键:把数据库数据填充到DataSet
            adapter.Fill(dataSet, "TheTable");
            
            DataTable TheTable = dataSet.Tables["TheTable"];
            // 先检查一下表有没有行
            if (TheTable.Rows.Count == 0)
            {
                MessageBox.Show("数据表中没有数据哦");
                return;
            }
            
            // 4. 再用DataReader读取数据
            StringBuilder S = new StringBuilder();
            DataColumnCollection Cols = TheTable.Columns;
            using (DataTableReader Rows = TheTable.CreateDataReader())
            {
                while (Rows.Read())
                {
                    // 读取数据前可以先判断是否为空
                    if (!Rows.IsDBNull(0))
                    {
                        long Id = Rows.GetInt64(0);
                        S.AppendLine($"ID: {Id}");
                    }
                    if (!Rows.IsDBNull(1))
                    {
                        DateTime StartTime = Rows.GetDateTime(1);
                        S.AppendLine($"StartTime: {StartTime}");
                    }
                    // 其他字段同理
                }
            }
            // 输出结果
            MessageBox.Show(S.ToString());
        }
        catch (Exception ex)
        {
            MessageBox.Show("出错了:" + ex.Message);
        }
    }
}

2. 其他可能的原因

  • 查询条件过滤了所有数据:如果你的查询语句带了WHERE条件,可能条件太严格导致没有返回结果。先改成SELECT * FROM YourTableName测试,看能不能拿到数据。
  • DataReader使用细节:确保你在调用Rows.Read()前,DataReader处于可用状态。另外,使用完DataReader后记得用using语句自动释放资源,避免内存泄漏。
  • 数据类型兼容问题:虽然你能拿到列信息,但读取时如果类型不匹配(比如用GetInt64读取实际是int的列),可能会抛出异常,但如果是允许为空的列,记得先用IsDBNull()判断,避免报错。

先从检查DataSet是否被正确填充开始,这是最常见的问题!如果填充后TheTable.Rows.Count还是0,那可能数据库里该表本身就没有数据,或者连接的数据库文件不对(比如你连接的是副本而非实际有数据的文件)。

内容的提问来源于stack exchange,提问作者Don Del Grande

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:29:46