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

GetProduct方法弹窗显示异常求助:仅显示Price且标题为IndexOutOfBoundsException

问题分析与解决方案

看样子你遇到的问题主要来自两个地方:数据读取时的索引/列名错误,以及MessageBox的参数顺序搞反了,咱们来一步步修复:

错误根源拆解

  1. IndexOutOfBoundsException作为弹窗标题:说明你在读取数据库返回的数据时,使用了超出列范围的索引(比如用reader[3]但查询只有3列,索引是0/1/2),或者列名拼写错误,导致抛出异常;同时你把异常信息当成了弹窗标题——这是因为MessageBox.Show的参数顺序搞反了!
  2. 弹窗只显示"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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:08:12