SqlConnection连接失败主因是连接字符串错误或权限未开;需正确指定服务器实例、数据库名,启用TCP/IP和混合认证;防火墙、SQL Server Browser及端口配置须检查;务必用using块释放资源并参数化查询防注入。

SqlConnection 连接字符串写错,连不上数据库
连不上最常见原因是连接字符串格式不对或权限没开。SQL Server 默认不启用 TCP/IP,本地用 localhost 或 . 可能失败,远程更大概率报 SqlException: A network-related or instance-specific error...。
- 本地开发优先用
Server=(local)\SQLEXPRESS(SQL Server Express 默认实例)或Server=localhost\MSSQLSERVER(默认命名实例) - 连接字符串里必须明确指定
Database=xxx,不能只写服务器名;如果库不存在,SqlConnection不会自动创建,只会报错 - Windows 身份验证用
Integrated Security=true;SQL 账户登录要确保User ID=xxx;Password=yyy且 SQL Server 已启用混合模式认证 - 防火墙、SQL Server Browser 服务、TCP 端口(默认 1433)三个地方任一被拦,都会静默超时——建议先用 SSMS 手动连通再写代码
用 using 块释放 SqlConnection 和 SqlCommand
不显式释放连接对象会导致连接池耗尽,后续请求卡住或抛 Timeout expired. The timeout period elapsed...。C# 的 SqlConnection 实现了 IDisposable,但很多人只 Close() 不 Dispose(),或在异常分支漏掉释放。
- 必须用
using块包裹SqlConnection、SqlCommand、SqlDataReader—— 它们都实现IDisposable - 不要手动调用
Close()或Dispose(),using会在作用域结束时强制执行,包括异常发生时 - 连接字符串里的
Pooling=true(默认开启)意味着连接实际是复用的,但你仍得“归还”它,否则连接池认为你还占着
using (var conn = new SqlConnection(connStr))
{
conn.Open();
using (var cmd = new SqlCommand("SELECT COUNT(*) FROM Users", conn))
{
var count = (int)cmd.ExecuteScalar();
} // cmd.Dispose() 自动触发
} // conn.Dispose() 自动触发,连接归还池中参数化查询防 SQL 注入,别拼接字符串
用 string.Format 或 $"" 拼接 SQL 是高危操作,哪怕只处理内部数据,一旦字段含单引号或分号就崩,还可能被注入删库语句。
-
SqlCommand.CommandText里所有动态值必须走Parameters.Add(),比如cmd.Parameters.AddWithValue("@id", userId) - 避免用
AddWithValue处理null或日期——它可能推断错类型导致索引失效;明确用Add("@id", SqlDbType.Int).Value = userId - WHERE 条件里多个参数别写成
"WHERE Name = '" + name + "'",哪怕加了引号转义也不安全;SQL Server 对 Unicode 字符、注释符等有特殊解析逻辑
EF Core vs 原生 ADO.NET:选哪个做持久化
不是“谁更好”,而是“场景是否匹配”。EF Core 封装深,写简单 CRUD 快,但查复杂报表、调存储过程、做批量更新时容易绕弯甚至性能翻车。
- 纯增删改查、领域模型稳定 → 用 EF Core,
DbContext.SaveChanges()自动跟踪变更 - 需要控制 SQL、复用现有存储过程、高频大批量导入(如日志入库)→ 直接用
SqlConnection+SqlBulkCopy或原生命令 - EF Core 的延迟加载(Lazy Loading)默认关着,但若开了又没注意导航属性访问时机,可能触发 N+1 查询——比手写 SQL 多十几倍请求
- EF Core 迁移(
dotnet ef migrations add)生成的 SQL 不一定适合生产环境,尤其涉及索引、约束、分区表时,得人工 review
该写的都写了,但最容易被跳过的其实是连接字符串里的 Connect Timeout 和 Application Name —— 前者决定你等多久才报错,后者决定了 SQL Server Profiler 里能不能快速过滤出你的应用流量。


















