同一窗口读取数据库数据时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
相关产品推荐
相关产品推荐

