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

如何解决SQL JOIN查询引发的System.Data.DuplicateNameException异常?

修复JOIN查询引发的DuplicateNameException错误

问题根源

用SELECT *关联A、B两表时,若两表存在同名列,GridView绑定过程中DataReader自动转换为DataTable时,会因DataTable不允许重复列名触发DuplicateNameException。

具体修复方法

1. 显式指定列并给重复列设别名(推荐)

放弃SELECT *,手动列出需要的字段,对重复列用AS设置唯一别名:

SELECT TOP 3 
    T0."id", T0."name", 
    T1."id" AS "b_id", T1."desc"
FROM A T0 
LEFT OUTER JOIN B T1 ON T1."something" = T0."somethingsecond"

确保每个列名唯一,从根源避免冲突。

2. 手动构建DataTable处理重复列

若必须保留原列名逻辑,可手动创建DataTable并处理重复列后再绑定:

using (HanaCommand cmd = new HanaCommand("SELECT top 3* FROM A T0 LEFT OUTER JOIN B T1 ON T1.\"something\"= T0.\"somethingsecond\" ", conn))
{
    HanaDataReader productInfoReader = cmd.ExecuteReader();
    DataTable dt = new DataTable();
    
    // 遍历字段,处理重复列名
    for (int i = 0; i < productInfoReader.FieldCount; i++)
    {
        string colName = productInfoReader.GetName(i);
        // 列名重复时添加表标识前缀
        if (dt.Columns.Contains(colName))
        {
            colName = i < productInfoReader.FieldCount/2 ? $"T0_{colName}" : $"T1_{colName}";
        }
        dt.Columns.Add(colName, productInfoReader.GetFieldType(i));
    }
    
    // 逐行填充数据
    while (productInfoReader.Read())
    {
        DataRow row = dt.NewRow();
        for (int i = 0; i < productInfoReader.FieldCount; i++)
        {
            row[i] = productInfoReader[i];
        }
        dt.Rows.Add(row);
    }
    
    GridView1.DataSource = dt;
    GridView1.DataBind();
}

额外提示

  • 生产环境禁止用SELECT *,既会引发列名冲突,还会查询冗余字段拖慢性能。
  • 优先选择第一种方案,代码更简洁且性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:15:45