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

同一窗口读取数据库数据时SqlConnection无法打开,提示超时错误

解决数据库连接超时及代码优化问题

看起来你的代码里存在几个关键问题,不仅会导致连接超时,还可能引发资源泄漏,我来帮你一步步梳理和修正:

首先,代码里的明显问题

  • 连接打开时机错误+多余的手动关闭:你在using块外调用了con.Open(),还手动加了con.Close()。其实using语句的核心作用就是自动释放IDisposable资源,SqlConnection的Dispose()方法会自动关闭连接,所以手动关闭完全多余,反而可能干扰资源释放流程。正确的做法是把连接创建和打开都放在using内部。
  • 缺少连接超时配置:默认的SQL Server连接超时是15秒,如果数据库响应稍慢就会触发超时。可以在连接字符串里显式设置更长的超时时间(比如30秒)。
  • 变量引用错误:代码里的w1TB.Text = Name;这里的Name没有定义,应该是你从DataReader里读取的DR["Name"]。
  • 类型转换不够安全:如果Id字段是int类型,用Convert.ToInt16容易溢出,换成Convert.ToInt32更稳妥。

修正后的代码

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
        InitializeComponent(); 
        // 调整连接字符串,添加超时配置,可根据实际情况修改超时值
        string connectionString = "Data Source=.; initial catalog=xyz; user id=sa; password=charcha; Connection Timeout=30;";
        
        // using包裹SqlConnection,确保连接资源自动释放
        using (SqlConnection con = new SqlConnection(connectionString)) 
        { 
            SqlCommand cmd = new SqlCommand("select * from catagories where Id=1", con); 
            try
            {
                con.Open(); // 在using内部打开连接
                // 用using包裹SqlDataReader,自动释放读取器资源
                using (SqlDataReader DR = cmd.ExecuteReader()) 
                { 
                    if (DR.Read()) 
                    { 
                        int Id = Convert.ToInt32(DR["Id"]);
                        string categoryName = Convert.ToString(DR["Name"]);
                        MessageBox.Show(categoryName); 
                        w1TB.Text = categoryName; // 修正变量引用问题
                    } 
                }
            }
            catch (SqlException ex)
            {
                // 捕获SQL异常,方便排查具体问题(比如超时、权限错误等)
                MessageBox.Show($"数据库操作出错:{ex.Message}");
            }
        } 
    } 
}

额外的超时排查建议

如果修正代码后还是出现超时,你可以从这几个方向排查:

  • 确认本地SQL Server服务是否正在运行(打开服务管理器,找SQL Server相关服务)。
  • 验证sa账号的密码是否正确,并且该账号有访问xyz数据库和catagories表的权限。
  • 在SSMS(SQL Server管理工具)里直接运行select * from catagories where Id=1,看看查询本身是否耗时过长(如果表数据量极大且Id没有主键/索引,可能会慢)。
  • 检查本地防火墙是否阻止了SQL Server的默认端口(1433),不过你用的是本地服务器,这个概率较低,但也可以确认下。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:34:57