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

