C#控制器导入Excel/CSV时,如何检查指定列是否存在并赋值?
解决方案:CSV导入时检查列存在性并正确赋值
首先,你的代码里有两个需要修正的地方:一是没有检查目标列是否存在,直接访问不存在的列会引发异常;二是实体对象在循环外创建,这会导致EF上下文重复添加同一个实例,最终数据可能不符合预期。
下面是修改后的完整代码,我会标注关键改动:
using (ApplicationDbContext db = new ApplicationDbContext()) { // 清空表数据 db.Database.ExecuteSqlCommand("TRUNCATE TABLE COCoreMembers"); // 读取CSV文件到DataTable DataAccess.DataTable abc = DataAccess.DataTable.New.ReadCsv(Server.MapPath("~/App_Data/TempBrdcepPSC/PscData/co_members.csv")); // 先检查DataTable是否包含CNIC列,避免后续循环中出错 bool hasCnicColumn = abc.Columns.Contains("CNIC"); foreach (Row Row in abc.Rows) { // 重要:把实体对象的创建放到循环内部,确保每一行对应一个新实例 COCoreMember xyz = new COCoreMember(); xyz._URI = Row["_URI"]; xyz._PARENT_AURI = Row["_PARENT_AURI"]; xyz.HHID = Row["HHID"]; xyz.HHNAME = Row["HHNAME"]; xyz.HH_SET_ID = Row["HH_SET_ID"]; xyz.HH_SET_NAME = Row["HH_SET_NAME"]; xyz.MEM_ID = Row["MEM_ID"]; xyz.MEM_NAME = Row["MEM_NAME"]; xyz.MEMBER_AGE = Row["MEMBER_AGE"]; xyz.POSITION = Row["POSITION"]; xyz.CELL = Row["CELL"]; // 检查CNIC列是否存在,再决定赋值 if (hasCnicColumn) { // 列存在时,取对应值(注意处理空值情况) var cnicValue = Row["CNIC"]; xyz.CNIC = cnicValue != null ? cnicValue.ToString() : "no record"; } else { // 列不存在时,直接赋值为"No Record" xyz.CNIC = "No Record"; } db.COCoreMembers.Add(xyz); db.SaveChanges(); } }
关键改动说明:
- 列存在性检查:在循环前通过
abc.Columns.Contains("CNIC")判断列是否存在,避免后续访问不存在的列引发IndexOutOfRangeException。 - 实体对象实例化位置:将
COCoreMember xyz = new COCoreMember();移到foreach循环内部,确保每一行数据对应一个全新的实体实例,避免EF上下文跟踪重复对象导致的数据异常。 - 空值处理:即使列存在,也要处理单元格为空的情况,避免
NullReferenceException。 - 统一赋值逻辑:明确区分列存在/不存在两种场景,逻辑更清晰。
如果你的DataAccess.DataTable的Row对象访问不存在的列不会抛出异常(比如返回null),也可以在循环内直接判断Row["CNIC"]是否为null,但提前检查列存在性会更高效,也更安全。
内容的提问来源于stack exchange,提问作者Sadia
相关产品推荐
相关产品推荐

