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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:02:18