C#向多个结构相同的DataTable插入数据的最优实现方式是什么
问题原因分析
- 变量名不匹配:你声明的两个DataTable变量为
startEvent和endEvent,但分支逻辑中使用的是dtStartedEvents和dtEndedEvents,名称不一致会直接触发运行时错误。 - 行所属上下文不匹配:你调用
DTEvents().NewRow()时,DTEvents()会返回一个全新的临时DataTable实例,新建的行属于这个临时表,且从未被加入任何表的行集合,行状态为Detached。ImportRow方法默认会忽略该状态的行,因此不会真正把行添加到目标表中。
正确实现方案
方案1:先确定目标表再创建行(推荐)
直接用目标表实例创建行,无需额外复制操作,性能最优:
// 先根据事件类型判断要加入的目标表 DataTable targetTable; switch (eventType) { case "STARTED": targetTable = startEvent; break; case "ENDED": targetTable = endEvent; break; default: // 非指定事件类型直接返回,执行自定义异常逻辑也可 return; } // 用目标表创建新行,行天然属于目标表上下文 DataRow newRow = targetTable.NewRow(); // 此处为填充newRow的业务代码 // newRow["VIN"] = "xxx"; // newRow["EventTime"] = DateTime.Now; // ...其余字段依次填充 // 直接加入目标表的行集合即可 targetTable.Rows.Add(newRow);
方案2:先填充临时行再分配到目标表
如果你的业务逻辑需要先填充完行的所有字段,再判断要加入的目标表,可以用ItemArray批量复制所有列的值:
// 先创建临时行并填充所有字段 DataRow tempRow = DTEvents().NewRow(); // 此处为填充tempRow的业务代码 switch (eventType) { case "STARTED": DataRow startRow = startEvent.NewRow(); // 批量复制所有列的值,无需逐个字段赋值 startRow.ItemArray = tempRow.ItemArray; startEvent.Rows.Add(startRow); break; case "ENDED": DataRow endRow = endEvent.NewRow(); endRow.ItemArray = tempRow.ItemArray; endEvent.Rows.Add(endRow); break; default: break; }
内容的提问来源于stack exchange,提问作者Daniel Barnes
相关产品推荐
相关产品推荐

