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

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];
    }
    // 如果需要处理更多结果,可以继续扩展判断
}

关键说明

  1. 分离数据收集与UI赋值:先把所有查询结果都存入listR,循环结束后再统一处理按钮文本,避免循环过程中访问不存在的索引。
  2. SQL注入防护:原代码用字符串拼接生成SQL语句,存在严重的SQL注入风险,改用参数化查询可以彻底避免这个问题。
  3. 边界判断:通过listR.Count判断集合长度,确保访问索引时不会越界,即使查询结果不足2个也不会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:50:25