GetProduct方法弹窗显示异常求助:仅显示Price且标题为IndexOutOfBoundsException
问题分析与解决方案
看样子你遇到的问题主要来自两个地方:数据读取时的索引/列名错误,以及MessageBox的参数顺序搞反了,咱们来一步步修复:
错误根源拆解
- IndexOutOfBoundsException作为弹窗标题:说明你在读取数据库返回的数据时,使用了超出列范围的索引(比如用
reader[3]但查询只有3列,索引是0/1/2),或者列名拼写错误,导致抛出异常;同时你把异常信息当成了弹窗标题——这是因为MessageBox.Show的参数顺序搞反了! - 弹窗只显示"Price":大概率是你把弹窗的「内容」和「标题」参数写反了,比如误写了
MessageBox.Show("Price", 产品信息内容),结果把"Price"当成内容显示,而异常信息(因为读取失败)变成了标题。
修正后的完整代码
我补全了你的代码,同时修复了所有问题:
public static Product GetProduct(string code) { Product product = null; // 使用using自动释放连接资源,避免内存泄漏 using (SqlConnection connection = Connection.GetConnection()) { // 用参数化查询!防止SQL注入,同时确保查询匹配准确 string select = @"SELECT ProductCode, Description, UnitPrice FROM Products WHERE ProductCode = @ProductCode"; using (SqlCommand command = new SqlCommand(select, connection)) { command.Parameters.AddWithValue("@ProductCode", code); connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { // 用列名读取数据,比索引更安全(不会因为表结构列顺序变化出错) string productCode = reader["ProductCode"].ToString(); string description = reader["Description"].ToString(); decimal unitPrice = (decimal)reader["UnitPrice"]; // 组装要显示的完整信息 string messageContent = $"产品编码:{productCode}\n产品描述:{description}\n单价:{unitPrice:C}"; // 注意顺序:MessageBox.Show(显示内容, 弹窗标题) MessageBox.Show(messageContent, "产品详情"); // 实例化Product对象返回 product = new Product { ProductCode = productCode, Description = description, UnitPrice = unitPrice }; } else { MessageBox.Show("未找到匹配编码的产品", "查询提示"); } } } } return product; }
关键修正点
- 参数化查询:替换掉直接拼接字符串的方式,既防止SQL注入,也避免因为编码包含特殊字符导致查询失败
- 用列名读取数据:避免索引越界问题,同时代码可读性更高,后续表结构调整(比如列顺序变化)也不会影响功能
- 修正MessageBox参数顺序:第一个参数是弹窗要展示的内容,第二个是弹窗标题,这是解决你当前弹窗显示异常的核心
- using语句包裹资源:自动释放数据库连接、命令、阅读器,避免资源泄漏
- 完整组装显示内容:把产品编码、描述、价格都拼进弹窗内容里,实现你想要的展示效果
内容的提问来源于stack exchange,提问作者GSto
相关产品推荐
相关产品推荐

