数据库循环查询仅返回数组最后一个元素结果的问题排查
问题解决:仅最后一个数组元素查询成功的原因及修复方案
问题核心原因
- 换行符处理不当:Windows环境下文本框的换行是
\r\n,用Split('\n')分割后,除最后一个元素外,其余元素末尾会带有\r(回车符),导致查询的订单编码与数据库中存储的不一致,无法匹配。 - SQL字符串拼接的隐患:直接拼接字符串生成SQL语句,不仅存在SQL注入风险,还会因隐藏字符(如回车符)导致查询条件不匹配,同时无法处理特殊字符的转义问题。
- DataReader资源管理不规范:手动调用
reader.Close()可能因异常导致资源未释放,且未利用using语句自动管理资源生命周期。
修复后的完整代码
// 正确分割文本框内容,去除空行和多余的换行/回车符 allCodes = kodTxtBox.Text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < allCodes.Length; i++) { // 清除编码前后的空白字符,避免隐藏空格影响查询匹配 string currentCode = allCodes[i].Trim(); // 使用参数化查询,避免SQL注入,同时确保参数正确传递 string queryString = @"SELECT siparisKod, aciklama, birim, fGrup, birimfiyat FROM ürünler WHERE siparisKod = ?"; using (OleDbCommand query = new OleDbCommand(queryString, connection)) { // 绑定查询参数,指定参数类型和值 query.Parameters.Add("@siparisKod", OleDbType.VarChar).Value = currentCode; // 用using自动管理DataReader资源,无需手动Close using (OleDbDataReader reader = query.ExecuteReader()) { if (reader.Read()) { MessageBox.Show($"{currentCode} 查询成功"); string desc = reader["aciklama"].ToString(); string monad = reader["birim"].ToString(); string sellPrice = reader["birimfiyat"].ToString(); MessageBox.Show($"描述: {desc} 单位: {monad} 单价: {sellPrice}"); } else { MessageBox.Show($"编码 {currentCode} 查询失败(不存在或匹配错误)"); } } } }
关键改动说明
- 修正文本分割逻辑:通过
Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)分割文本,同时调用Trim()清除每个编码的前后空白字符,彻底解决隐藏字符导致的匹配失败问题。 - 替换为参数化查询:使用OleDb的参数占位符
?,通过Parameters.Add传递参数,既避免了SQL注入风险,又能正确处理字符串中的特殊字符,确保查询条件准确。 - 自动管理资源:用
using语句包裹OleDbCommand和OleDbDataReader,确保资源在使用后自动释放,避免内存泄漏和异常情况下的资源残留。
内容的提问来源于stack exchange,提问作者Red Life
相关产品推荐
相关产品推荐

