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
相关产品推荐
相关产品推荐

