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

代码执行报System.IndexOutOfRangeException,phpMyAdmin查询正常求排查

问题原因及解决方法

核心问题

你遇到的IndexOutOfRangeException是因为MySqlDataReader读取结果集时,列名不包含表名前缀。虽然phpMyAdmin会显示列所属的表,但数据库返回给程序的结果集中,列名仅保留category_id、category这类原始列名,而非categories.category_id这种带表名的格式。

两种解决办法

方法1:直接使用不带表前缀的列名读取

你的SQL查询里没有重名列(categories.category_id和subcategory.subCategory_id是不同列名),可以直接去掉表名前缀读取:

修改循环内的代码:

while (dr.Read())
{
    Category category = new Category(
        dr.GetInt32("category_id"), 
        dr.GetString("category"), 
        dr.GetInt32("subCategory_id"), 
        dr.GetString("subCatName")
    );
    categories.Add(category);
}

方法2:给SQL列添加别名(更稳妥,避免重名风险)

如果后续查询出现重名列,推荐给列指定别名,明确读取的列:

先修改SQL语句:

SELECT 
    categories.category_id AS cat_id, 
    categories.category AS cat_name, 
    subcategory.subCatName AS sub_cat_name, 
    subcategory.subCategory_id AS sub_cat_id 
FROM subcategory 
INNER JOIN categories ON categories.category_id = subcategory.category_id

再修改读取代码:

while (dr.Read())
{
    Category category = new Category(
        dr.GetInt32("cat_id"), 
        dr.GetString("cat_name"), 
        dr.GetInt32("sub_cat_id"), 
        dr.GetString("sub_cat_name")
    );
    categories.Add(category);
}

补充说明

phpMyAdmin能正常显示带表名的列,是因为它额外获取了列的表归属信息并展示,但实际返回给程序的结果集元数据里,列名是不带表前缀的,这就是为什么DataReader找不到带表名的列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:30:45