使用C#通过DAO批量插入Access数据时遇空引用异常求助
问题分析与解决方案
空引用异常的直接原因
你代码里的Field[] recFields = new Field[7];只是创建了一个长度为7的数组,但数组内的每个Field元素都未实例化,也没有关联到Recordset的实际字段对象。访问recFields[k].Value时,recFields[k]是null,因此触发NullReferenceException。
代码中的其他逻辑错误
除空引用问题外,代码还有几处明显问题:
- 外层循环边界错误:
for(int i=0; i<=recList.Count;i++)会导致List索引越界,List的有效索引范围是0到Count-1,应改为i < recList.Count。 - 内层循环逻辑混乱:你在k循环里反复给同一个
recFields[k]赋值7次,最终只会保留Test7的值;同时错误使用recList[k]获取数据,应该用外层循环的recList[i](i是当前要插入的记录索引)。 - 空异常捕获:空catch块会掩盖调试信息,至少要输出异常详情。
- 未使用事务:插入10万条数据时,开启事务能大幅提升插入效率。
修正后的代码
public void testDAO() { try { List<DB.Rec> recList = getData(); DBEngine dbEngine = new DBEngine(); using (Database db = dbEngine.OpenDatabase(@"C:\Recs2001.mdb")) { // 开启事务提升批量插入速度 db.BeginTrans(); using (Recordset rs = db.OpenRecordset("RecsCD")) { // 从Recordset获取对应字段对象,避免空引用 Field fieldTest1 = rs.Fields["Test1"]; Field fieldTest2 = rs.Fields["Test2"]; Field fieldTest3 = rs.Fields["Test3"]; Field fieldTest4 = rs.Fields["Test4"]; Field fieldTest5 = rs.Fields["Test5"]; Field fieldTest6 = rs.Fields["Test6"]; Field fieldTest7 = rs.Fields["Test7"]; foreach (var rec in recList) { rs.AddNew(); // 直接给对应字段赋值 fieldTest1.Value = rec.Test1; fieldTest2.Value = rec.Test2; fieldTest3.Value = rec.Test3; fieldTest4.Value = rec.Test4; fieldTest5.Value = rec.Test5; fieldTest6.Value = rec.Test6; fieldTest7.Value = rec.Test7; rs.Update(); } } // 提交事务 db.CommitTrans(); } } catch (Exception ex) { // 输出异常信息便于调试 Console.WriteLine($"插入失败:{ex.Message}\n{ex.StackTrace}"); // 若事务已开启,可在此回滚 // db?.Rollback(); } }
额外优化建议
- 插入前临时关闭目标表的索引,插入完成后重建索引,能进一步提升插入速度。
- 如果
getData()返回的数据量极大,可分批次插入,避免内存占用过高。
内容的提问来源于stack exchange,提问作者Anjali
相关产品推荐
相关产品推荐

