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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:51:01