代码执行报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
相关产品推荐
相关产品推荐

