如何在C#中实现两个SqlDataReader的切换?附相关代码片段
嗨,我来帮你搞定两个SqlDataReader的切换功能!先从优化现有代码的小问题开始,再一步步实现切换逻辑:
实现两个SqlDataReader的切换功能指导
第一步:修复现有代码的SQL注入风险
原代码直接把用户输入拼进SQL语句,这会导致严重的SQL注入漏洞,先改成更安全的参数化查询,同时优化资源管理:
private void supplBox_SelectedIndexChanged(object sender, EventArgs e) { // 用using语句自动释放连接、命令、Reader资源,无需手动Close using (var sqlcon = new SqlConnection("你的数据库连接字符串")) { sqlcon.Open(); string sql = "Select * from Supplier_info where Supplier_name = @SupplierName"; using (var cmd = new SqlCommand(sql, sqlcon)) { cmd.Parameters.AddWithValue("@SupplierName", supplBox.Text); using (SqlDataReader reader = cmd.ExecuteReader()) { // 按名称查询应该只有一条结果,用if代替while更高效 if (reader.Read()) { suppNum.Text = reader.GetInt32(0).ToString(); } } } } barCode1.Focus(); }
第二步:实现两个SqlDataReader的切换逻辑
假设你需要根据业务条件(比如用户输入类型、操作场景)切换使用不同的查询逻辑和Reader,这里以suppNum_KeyUp事件为例,实现“按编号查询/按名称查询”的切换:
private void suppNum_KeyUp(object sender, KeyEventArgs e) { // 比如用户按下Enter键时执行查询切换 if (e.KeyCode == Keys.Enter) { using (var sqlcon = new SqlConnection("你的数据库连接字符串")) { sqlcon.Open(); SqlCommand targetCmd; SqlDataReader targetReader; // 切换条件:判断输入是否为数字,决定用编号还是名称查询 if (int.TryParse(suppNum.Text, out int supplierId)) { // 第一个Reader场景:按供应商编号查询 targetCmd = new SqlCommand("Select * from Supplier_info where Supplier_id = @SupplierId", sqlcon); targetCmd.Parameters.AddWithValue("@SupplierId", supplierId); } else { // 第二个Reader场景:按供应商名称查询 targetCmd = new SqlCommand("Select * from Supplier_info where Supplier_name = @SupplierName", sqlcon); targetCmd.Parameters.AddWithValue("@SupplierName", suppNum.Text); } using (targetReader = targetCmd.ExecuteReader()) { if (targetReader.Read()) { // 将查询结果回显到控件 supplBox.Text = targetReader.GetString(targetReader.GetOrdinal("Supplier_name")); suppNum.Text = targetReader.GetInt32(targetReader.GetOrdinal("Supplier_id")).ToString(); } else { MessageBox.Show("未找到匹配的供应商信息"); } } } } }
关键注意事项:
- 始终用
using语句包裹数据库相关对象,它们会自动释放资源,避免内存泄漏和连接占用问题。 - 切换Reader的核心是根据业务条件选择不同的SQL命令,再创建对应的Reader即可,无需复杂的“切换”操作。
- 尽量用
GetOrdinal("列名")代替固定索引数字(比如0),这样代码更健壮,数据库表结构变化时不容易出错。
内容的提问来源于stack exchange,提问作者Point_Systems
相关产品推荐
相关产品推荐

