C#从MySQL查询结果提取拆分字符串时遇索引越界问题求助
问题分析与解决方案
错误根源
你遇到的ArgumentOutOfRangeException是因为在while(reader.Read())循环内部,每次添加一个表名到listR后就立刻访问listR[1]。第一次循环时,listR里只有刚添加的第一个元素,索引1不存在,直接访问就会触发索引越界错误。
虽然查询能返回两个表名,但循环是逐行读取的:第一次循环读第一个表名,添加到listR;第二次循环读第二个表名,再添加到listR。你在第一次循环时就去取listR[1],自然会报错。
修正后的代码
using (MySqlConnection connection = new MySqlConnection(verbindung)) { connection.Open(); // 改用参数化查询避免SQL注入风险 string query = @"show tables like @searchText"; MySqlCommand command = new MySqlCommand(query, connection); command.Parameters.AddWithValue("@searchText", $"%{tbSearch.Text}%"); using (MySqlDataReader reader = command.ExecuteReader()) { listR.Clear(); // 先清空旧数据,避免重复累加 while (reader.Read()) { // 循环里只做数据收集,不处理UI赋值 listR.Add(reader.GetString(0)); } } // 循环结束后,根据集合长度给按钮赋值 if (listR.Count >= 1) { btnAccount.Text = listR[0]; } if (listR.Count >= 2) { btnAccount2.Text = listR[1]; } // 如果需要处理更多结果,可以继续扩展判断 }
关键说明
- 分离数据收集与UI赋值:先把所有查询结果都存入
listR,循环结束后再统一处理按钮文本,避免循环过程中访问不存在的索引。 - SQL注入防护:原代码用字符串拼接生成SQL语句,存在严重的SQL注入风险,改用参数化查询可以彻底避免这个问题。
- 边界判断:通过
listR.Count判断集合长度,确保访问索引时不会越界,即使查询结果不足2个也不会报错。
内容的提问来源于stack exchange,提问作者ZiAD
相关产品推荐
相关产品推荐

