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

C#如何将SQL查询多列数据存入不同变量及索引越界问题修复

索引越界问题排查与解决

问题根因

你遇到的索引越界错误核心来自index变量的错误使用:

  • 两个SQL查询都只返回单列结果,SqlDataReader的列索引最大只能是0
  • 第一次查询voucherId时,只要匹配到1条以上数据,循环内的index++就会把index变为≥1,下一次取reader[index]时直接超出列索引范围
  • 就算第一次只匹配到1条数据,跑完第一个查询后index已经是1,第二个查询取reader[1]同样会越界
  • 额外问题:两次独立查询完全没必要,还存在SQL注入风险,没有处理查询无匹配结果的边界情况

解决步骤

1. 核心逻辑修正

直接去掉错误的index自增逻辑,合并两个SQL查询为一次查询,同时取两个字段,减少数据库开销。

2. 添加参数化查询

避免SQL注入风险,不要直接拼接Session值到SQL语句。

3. 增加边界判断

处理查询无结果的情况,避免空值导致后续逻辑异常。

修正后代码

protected void Button1_Click(object sender, EventArgs e)
{
    string voucherId = String.Empty;
    string voucherAmount = String.Empty;
    // 合并查询,一次取两个字段
    string querySql = "select voucherid, voucheramount from ReturnForm where email = @Email;";

    using (SqlConnection con = new SqlConnection(str))
    {
        SqlCommand cmd = new SqlCommand(querySql, con);
        // 参数化查询,避免注入
        cmd.Parameters.AddWithValue("@Email", Session["username"]?.ToString() ?? "");
        con.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        // 只取第一条匹配的记录,你原有逻辑如果要取多条可以自行调整循环
        if (reader.Read())
        {
            // 直接按列名取,避免索引搞错,更易维护
            voucherId = reader["voucherid"].ToString();
            voucherAmount = reader["voucheramount"].ToString();
        }
    }

    if (!string.IsNullOrEmpty(voucherId) && txtVoucher.Text.Trim() == voucherId)
    {
        Label3.Visible = true;
        Label3.Text = voucherAmount;
    }
    else
    {
        // 可以加个不匹配的提示
        Label3.Visible = false;
    }
}

其他排查点

如果修改后还有问题,可以按以下步骤确认:

  • 检查ReturnForm表的voucherid、voucheramount字段名是否拼写正确
  • 确认Session["username"]是否有值,空值会导致查询不到匹配记录
  • 如果同一邮箱对应多条优惠券记录,按需调整读取逻辑,是取最新还是全部匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:36:01