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

SqlDataReader读取数据库值异常,ComboBox无法加载正确数据

问题修复方案

核心问题

你看到System.Data.SqlClient.SqlDataReader是因为代码里直接把数据读取器对象转成字符串了,而不是读取makeName字段的实际值。另外代码还有几个逻辑和安全问题,一起修复:

具体修复点

  • 正确读取字段值:把myReader.ToString()改成myReader["makeName"].ToString(),过滤查询处同理。
  • 替换拼接SQL为参数化查询:避免SQL注入,同时解决字符串拼接的语法错误(原代码里LIKE后面的空格和通配符位置不对)。
  • 用using管理数据库资源:自动释放连接、命令、读取器,避免资源泄漏。
  • 修正循环逻辑:第二个while会无限循环,改成if判断即可。
  • 修复命令对象误用:过滤查询时要调用新建的searchMakeSearch的ExecuteReader(),不是原命令的。

修正后的完整代码

public void fillMakeBox() // 用于填充车辆构建器的品牌选择框。
{
    // 用using自动管理连接,无需手动关闭
    using (var connection = new SqlConnection("你的数据库连接字符串"))
    {
        connection.Open();
        List<string> makes = new List<string>();
        string makesQuery = "SELECT makeName from makes";
        
        // 用using管理SqlCommand
        using (SqlCommand makesSearch = new SqlCommand(makesQuery, connection))
        {
            // 用using管理SqlDataReader
            using (SqlDataReader myReader = makesSearch.ExecuteReader())
            {
                while (myReader.Read())
                {
                    // 读取makeName字段的实际值
                    makes.Add(myReader["makeName"].ToString());
                }
            }
        }

        // 改成if,避免无限循环
        if (makeSelection.SelectedItem != null)
        {
            List<string> filteredMakes = new List<string>();
            // 参数化查询,避免SQL注入,同时修正LIKE语法
            string searchMakesQuery = "Select makeName from makes WHERE makeName LIKE @searchValue";
            
            using (SqlCommand searchMakeSearch = new SqlCommand(searchMakesQuery, connection))
            {
                // 添加参数,通配符放在参数值里
                searchMakeSearch.Parameters.AddWithValue("@searchValue", $"{makeSelection.SelectedItem}%");
                
                using (SqlDataReader myReaderFilter = searchMakeSearch.ExecuteReader())
                {
                    while (myReaderFilter.Read())
                    {
                        filteredMakes.Add(myReaderFilter["makeName"].ToString());
                    }
                }
            }
            makes = filteredMakes;
        }

        makeSelection.DataSource = makes;
    }
}

额外说明

  • 如果你之前已经有全局的connection对象,也要确保在使用完后关闭,最好还是用using来管理,防止连接池耗尽。
  • 原代码里LIKE {makeSelection.SelectedItem} %的语法是错误的,通配符%应该和值连在一起,同时用参数化避免注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:40:19