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赋值还会抛出空引用异常。
修复方案
- 修改SQL查询语句,把两个表的Id都加入查询列表并设置别名:
select MainStore.Id as MainStoreId, SecondStore.Id as SecondStoreId, ItemName from MainStore inner join SecondStore on MainStore.Id = SecondStore.Id
- 修改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
相关产品推荐
相关产品推荐

