如何解决C#中“连接未关闭,当前状态为打开”的错误?
问题分析与解决建议
核心问题
- 连接未被可靠释放:如果
con.Open()之后的代码(比如Fill执行或赋值操作)抛出异常,con.Close()不会被执行,导致连接一直处于打开状态。 - SQL语法错误+注入风险:直接拼接字符串生成SQL,若
PositionName是字符串类型,你的SQL会缺少引号(比如选中值是"开发岗",生成的SQL是WHERE PositionName=开发岗,数据库会把开发岗当成列名而非字符串值),同时存在严重的SQL注入漏洞。 - 冗余的连接操作:
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
相关产品推荐
相关产品推荐

