SqlConnection连接失败主因是连接字符串错误或权限问题;必须用using释放资源;参数化查询需带@前缀;异步方法必须await。
SqlConnection 连接字符串写不对,连不上是常态
绝大多数连不上 sql server 的问题,都出在 connectionstring 格式或权限上,不是代码逻辑错。本地数据库用 localhost 或 . 通常可以,但远程服务器必须确认实例名、端口、是否启用 tcp/ip。
- Windows 认证最简:
"Server=localhost;Database=MyDB;Trusted_Connection=True;" - SQL 账户登录必须显式指定用户名密码:
"Server=192.168.1.100,1433;Database=MyDB;User Id=sa;Password=123;"(注意端口用英文逗号分隔) - 连接超时默认 15 秒,高延迟环境建议加
Connection Timeout=30 - 如果报
A network-related or instance-specific error...,先用 SQL Server Management Studio 手动连一下,排除服务未启动、防火墙拦截、SQL Browser 关闭导致命名实例不可达等问题
SqlCommand 查询没加 using,资源泄漏比想象中快
SqlConnection 和 SqlCommand 都实现 IDisposable,不显式释放会堆积连接池耗尽,尤其在 Web 应用里几小时内就可能触发 Timeout expired 错误。
- 必须套
using块,哪怕只查一条数据:using (var conn = new SqlConnection(connStr)) { conn.Open(); using (var cmd = new SqlCommand("SELECT COUNT(*) FROM Users", conn)) { var count = (int)cmd.ExecuteScalar(); } } - 不要把
conn提到方法外长期持有;也不要手动调conn.Close()——using自动处理更可靠 - 执行非查询语句(INSERT/UPDATE)用
ExecuteNonQuery(),返回受影响行数;查单值用ExecuteScalar();查多行用ExecuteReader(),且同样要using
参数化查询不写 @ 符号,SQL 注入和类型错误一起爆
拼接字符串查数据库是 C# 里最危险的习惯之一。SqlCommand.Parameters.Add() 必须带 @ 前缀,否则参数根本不会绑定,运行时报 Must declare the scalar variable "@name"。
- 正确写法:
cmd.CommandText = "SELECT * FROM Users WHERE Age > @minAge";然后cmd.Parameters.AddWithValue("@minAge", 18); -
AddWithValue自动推断类型,但对NULL或DateTime易出错;生产环境推荐用Add("@minAge", SqlDbType.Int).Value = 18; - WHERE 条件含多个参数时,顺序无关,只认名字;但
IN (@a,@b,@c)这种不支持 —— 参数不能代表列表,得动态拼 SQL 或用表值参数
异步方法用错 await,线程卡死比同步还难查
OpenAsync()、ExecuteReaderAsync() 这些异步方法必须配合 await,直接调用不 await 就等于丢弃 Task,连接可能没打开就往下走,或者抛 InvalidOperationException: There is already an open DataReader...。
- 方法签名必须加
async,返回Task或Task:public async Task<int> GetUserCountAsync() { using var conn = new SqlConnection(connStr); await conn.OpenAsync(); // 必须 await using var cmd = new SqlCommand("SELECT COUNT(*) FROM Users", conn); return (int)await cmd.ExecuteScalarAsync(); }</int> - ASP.NET Core 中控制器 Action 必须是
async Task,否则await不生效 - 同步方法里混用
.GetAwaiter().GetResult()容易引发死锁,尤其在 UI 线程或旧版 ASP.NET 中,能不用就别用
连接字符串细节、资源释放时机、参数符号、异步调用链——这四点漏掉任一个,都会让程序在特定负载或环境下突然崩掉,而且错误信息往往不指向真实原因。










