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

如何解决C#中“连接未关闭,当前状态为打开”的错误?

问题分析与解决建议

核心问题

  1. 连接未被可靠释放:如果con.Open()之后的代码(比如Fill执行或赋值操作)抛出异常,con.Close()不会被执行,导致连接一直处于打开状态。
  2. SQL语法错误+注入风险:直接拼接字符串生成SQL,若PositionName是字符串类型,你的SQL会缺少引号(比如选中值是"开发岗",生成的SQL是WHERE PositionName=开发岗,数据库会把开发岗当成列名而非字符串值),同时存在严重的SQL注入漏洞。
  3. 冗余的连接操作:SqlDataAdapter.Fill()方法会自动打开连接(如果未打开),执行完后会恢复连接原来的状态,手动调用Open()和Close()反而容易引发问题。

修复后的代码

public void getdept()
{
    // 使用using自动释放连接,无需手动Close
    using (SqlConnection con = new SqlConnection("你的数据库连接字符串"))
    {
        string query = "SELECT Department FROM positions WHERE PositionName = @PositionName";
        
        // 参数化查询,避免注入和语法错误
        using (SqlCommand cmd = new SqlCommand(query, con))
        {
            cmd.Parameters.AddWithValue("@PositionName", cbxposname.SelectedValue.ToString());
            
            DataTable dt = new DataTable();
            SqlDataAdapter sda = new SqlDataAdapter(cmd);
            sda.Fill(dt);
            
            if (dt.Rows.Count > 0)
            {
                txtdeptname.Text = dt.Rows[0]["Department"].ToString();
            }
            else
            {
                // 处理无匹配数据的情况
                txtdeptname.Text = string.Empty;
            }
        }
    }
}

额外优化提示

  • 不需要遍历所有行,因为你只需要给文本框赋值,取第一行即可(如果查询结果唯一的话)。
  • 始终用using语句包裹SqlConnection、SqlCommand这类实现IDisposable的对象,确保资源被及时释放,从根源避免连接泄漏。
  • 不要复用全局的con对象,每次数据库操作创建新连接即可,ADO.NET连接池会自动管理连接复用,不会影响性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:05:30