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

C#执行SQL内连接查询读取Id列报System.IndexOutOfRangeException错误是什么原因

问题根因

你的SQL查询语句仅查询了ItemName字段,查询返回的结果集中根本没有Id列,所以调用reader["Id"]读取不存在的列时自然会抛出System.IndexOutOfRangeException错误。你在SSMS中执行SQL能正常返回结果,恰恰是因为该SQL没有查询Id字段,仅返回了ItemName的内容,和JOIN逻辑本身无关。

同时因为MainStore和SecondStore两张表都存在Id字段,直接查询Id会出现重名冲突,还需要给查询字段设置别名区分。另外你当前代码没有初始化MainStore的SecondStore属性,后续直接给x.SecondStore.Id赋值还会抛出空引用异常。


修复方案

  1. 修改SQL查询语句,把两个表的Id都加入查询列表并设置别名:
select 
  MainStore.Id as MainStoreId,
  SecondStore.Id as SecondStoreId,
  ItemName
from MainStore
inner join SecondStore
on MainStore.Id = SecondStore.Id
  1. 修改C#读取逻辑,增加SecondStore实例化步骤,用别名读取对应的Id字段:
while (reader.Read())
{
    var x = new MainStore();
    // 先初始化关联的SecondStore对象,避免空引用异常
    x.SecondStore = new SecondStore();

    x.ItemName = reader["ItemName"].ToString();
    x.Id = (int)reader["MainStoreId"];
    x.SecondStore.Id = (int)reader["SecondStoreId"];

    storeList.Add(x);
}

如果你的Id字段允许为NULL,需要先通过reader.IsDBNull(reader.GetOrdinal("字段别名"))判断字段值是否为空,再做强制类型转换,避免转换报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:45:03