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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:39:19