最推荐使用 microsoft.data.sqlclient(.net core/.net 5+)或 system.data.sqlclient(.net framework)连接 sql server,配合 using 确保自动释放、配置文件管理连接字符串、并实现异常重试机制。

使用 SqlConnection 连接 SQL Server(最常用)
在 C# 中连接 SQL Server 数据库,最标准的方式是使用 System.Data.SqlClient(.NET Framework)或 Microsoft.Data.SqlClient(.NET Core/.NET 5+ 推荐)。后者是前者开源、跨平台的继任者,支持最新安全协议和 Azure AD 认证。
连接字符串示例(Windows 身份验证):
Server=localhost\SQLEXPRESS;Database=MyDB;Trusted_Connection=true;
连接字符串示例(SQL 账户验证):
Server=localhost;Database=MyDB;User Id=myuser;Password=mypass123;
⚠️ 注意:Trusted_Connection=true 和 Integrated Security=true 等价;若用 Microsoft.Data.SqlClient,需先通过 NuGet 安装包:Install-Package Microsoft.Data.SqlClient。
用 using 确保连接自动释放(关键实践)
数据库连接是稀缺资源,必须显式关闭或用 using 语句确保及时释放。以下写法安全可靠:
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
using (var cmd = new SqlCommand("SELECT COUNT(*) FROM Users", conn))
{
int count = (int)cmd.ExecuteScalar();
Console.WriteLine($"用户数:{count}");
}
}上面代码中,conn 和 cmd 都会在作用域结束时自动调用 Dispose(),即使发生异常也不会泄漏连接。不推荐手动调用 conn.Close() 或忽略 using —— 容易引发连接池耗尽、超时等生产问题。
连接字符串从配置文件读取(避免硬编码)
开发中应将连接字符串放在 appsettings.json(.NET Core/.NET 5+)或 App.config(.NET Framework)中,而非写死在代码里。
.NET 6+ 示例(appsettings.json):
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=MyDB;User Id=myuser;Password=mypass123;"
}
}在 Program.cs 中注入并使用:
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
using var conn = new SqlConnection(connectionString);这样做便于环境隔离(开发/测试/生产不同连接串)、配合密钥管理器(如 Azure Key Vault)和 CI/CD 流水线安全替换。
处理连接失败与重试逻辑(提升健壮性)
网络波动或 SQL Server 暂时不可用会导致 SqlException。简单重试 2–3 次可显著提升稳定性:
int maxRetries = 3;
for (int i = 0; i <= maxRetries; i++)
{
try
{
using var conn = new SqlConnection(connectionString);
conn.Open();
// 执行操作...
break; // 成功则退出循环
}
catch (SqlException ex) when (ex.Number == -2 || ex.Number == 10060 && i < maxRetries)
{
Thread.Sleep(1000 * (int)Math.Pow(2, i)); // 指数退避
}
}常见错误号:-2(超时)、10060(连接被拒绝)、4060(数据库不存在)、18456(登录失败)。建议结合 Polly 库实现更专业的重试策略。
连接最容易被忽略的问题是:未校验连接状态就直接执行命令。例如 conn.State != ConnectionState.Open 时调用 cmd.ExecuteNonQuery() 会抛出异常。应在执行前加判断,或依赖 using + Open() 的组合天然规避该问题。










