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

C#合并DataTable时出现‘There is no row at position ()’错误的排查与修改方案咨询

问题:DataTable合并时抛出"There is no row at position X"错误,如何修改并保留空值?

我在维护一段继承来的代码时,遇到了DataTable合并逻辑的问题:其余代码(包括我修改过的部分)均运行正常,唯有合并DataTable的代码出现异常。现有两个DataTable,第一个通过.csv文件获取,第二个来自其他数据源。运行下方代码时返回错误:There is no row at position (末尾索引值)。我明白需要处理第二个DataTable中的空值,但业务要求最终返回结果需保留空值。请问该错误是否由for (int i = 0; < table3.Rows.Count; i++)这行代码导致?如果是,该如何修改此合并操作?

相关代码:

DataTable netb = MergeDataTables(dt, temp);
return netb;
static DataTable MergeDataTables(DataTable table1, DataTable table2)
{
    DataTable table3 = table1.Copy();
    foreach (DataColumn dc in table2.Columns)
    {
        table3.columns.Add(dc.ColumnName).DataType = dc.DataType;
    }
    for (int i = 0; < table3.Rows.Count; i++)
    {
        foreach (DataColumn dc in table2.Columns)
        {
            string col = dc.ColumnName;
            table3.Rows[i][col] = table2.Rows[i][col];
        }
    }
}

回答

嘿,这个错误确实和你怀疑的那行代码脱不了干系,而且还有几个小问题得一起修正,咱们一步步拆解:

错误根源

  1. 语法错误:你写的for (int i = 0; < table3.Rows.Count; i++)缺少了循环变量i,正确写法应该是i < table3.Rows.Count,不过这只是编译层面的问题。
  2. 核心逻辑问题:你默认table1(也就是table3的副本)和table2的行数完全一致,但实际场景中两个数据源的行数大概率不一样。当table2的行数比table3少时,循环到table2没有的行索引时,就会触发There is no row at position X的索引越界错误。
  3. 列添加的小问题:你写的table3.columns.Add(dc.ColumnName).DataType = dc.DataType;不仅有大小写错误(columns应该是Columns),还可以简化成更安全的写法,同时最好先检查列是否已存在,避免重复添加报错。

修正后的代码(满足保留空值的业务需求)

下面的代码会处理两个表行数不一致的情况,同时自动保留空值:

DataTable netb = MergeDataTables(dt, temp);
return netb;

static DataTable MergeDataTables(DataTable table1, DataTable table2)
{
    DataTable table3 = table1.Copy();

    // 先添加table2的所有列,先检查列是否存在避免重复添加
    foreach (DataColumn dc in table2.Columns)
    {
        if (!table3.Columns.Contains(dc.ColumnName))
        {
            table3.Columns.Add(dc.ColumnName, dc.DataType);
        }
    }

    // 取两个表中行数的最大值,确保所有行都被覆盖
    int maxRowCount = Math.Max(table3.Rows.Count, table2.Rows.Count);

    // 如果table3的行数不足,先补充空行
    while (table3.Rows.Count < maxRowCount)
    {
        table3.Rows.Add(table3.NewRow());
    }

    // 循环处理每一行
    for (int i = 0; i < maxRowCount; i++)
    {
        foreach (DataColumn dc in table2.Columns)
        {
            string columnName = dc.ColumnName;
            // 只有当table2存在当前行时才赋值,否则保留空值
            if (i < table2.Rows.Count)
            {
                table3.Rows[i][columnName] = table2.Rows[i][columnName];
            }
            // 若table2没有当前行,table3对应列会保持DBNull.Value,刚好符合保留空值的要求
        }
    }

    return table3;
}

关于空值的说明

  • 如果table2的单元格本身是空值(DBNull.Value),赋值后table3的对应单元格也会保留这个空值。
  • 如果table2没有对应行,table3的对应列会自动保持DBNull.Value,完全满足你保留空值的业务要求,不需要额外处理。

内容的提问来源于stack exchange,提问作者BrianG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:19:07