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
相关产品推荐
相关产品推荐

