在ASP.NET Core中连接SQL Server数据库需使用Microsoft.Data.SqlClient库并配置连接字符串,以下是完整实现步骤及最佳实践:

环境准备
- 安装NuGet包:
Install-Package Microsoft.Data.SqlClient
- 配置appsettings.json:
{ "ConnectionStrings": { "DefaultConnection": "Server=.;Database=MyDB;User Id=sa;Password=YourStrong@Password;TrustServerCertificate=true;" } }
核心连接代码
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
// 在Startup.cs或Program.cs注入配置
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
// 数据库操作类
public class DatabaseService
{
public void ExecuteQuery()
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
connection.Open();
// 执行参数化查询(防SQL注入)
string sql = "SELECT FROM Users WHERE Id = @UserId";
using (SqlCommand command = new SqlCommand(sql, connection))
{
command.Parameters.AddWithValue("@UserId", 1);
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["UserName"]);
}
}
}
}
catch (SqlException ex)
{
// 记录错误到日志系统
Console.WriteLine($"SQL Error: {ex.Number} - {ex.Message}");
}
finally
{
// 连接池自动回收资源
}
}
}
}
关键技术解析
-
连接池优化
- 默认启用连接池(Max Pool Size=100)
- 使用
using语句确保连接及时释放 - 避免在循环中创建新连接
-
安全实践

- 连接字符串存储:
// 生产环境使用Azure Key Vault builder.Configuration.AddAzureKeyVault();
- 始终使用参数化查询
- 启用加密连接:
"Encrypt=true;TrustServerCertificate=false;"
- 连接字符串存储:
-
异步操作(高性能场景)
public async Task<List<User>> GetUsersAsync() { var users = new List<User>(); using (var conn = new SqlConnection(connectionString)) { await conn.OpenAsync(); var command = new SqlCommand("SELECT FROM Users", conn); using (var reader = await command.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { users.Add(new User { Id = reader.GetInt32(0), Name = reader.GetString(1) }); } } } return users; }
异常处理规范
catch (SqlException ex) when (ex.Number == 4060) // 数据库不可用
{
// 触发故障转移机制
}
catch (SqlException ex) when (ex.Number == 18456) // 登录失败
{
// 发送凭证错误警报
}
catch (TimeoutException)
{
// 启动重试策略
}
企业级部署建议
-
连接字符串配置策略:
// 环境区分配置 var env = builder.Environment; var config = new ConfigurationBuilder() .AddJsonFile($"appsettings.{env.EnvironmentName}.json") .Build(); -
连接健康检查(Kubernetes就绪探针):

builder.Services.AddHealthChecks() .AddSqlServer(configuration["ConnectionStrings:DefaultConnection"]);
性能监控
在Program.cs启用诊断:
// 记录SQL执行耗时
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(connectionString)
.EnableSensitiveDataLogging()
.LogTo(Console.WriteLine, LogLevel.Information));
深度思考:当连接池达到上限时,如何在不重启应用的情况下动态扩展?建议采用分片连接策略:根据业务模块创建独立连接池,例如将订单业务和用户业务的数据库连接分离配置,通过
Application Name标识:"ConnectionStrings": { "OrderDB": "Server=...;Application Name=OrderModule;", "UserDB": "Server=...;Application Name=UserModule;" }
您在实际项目中遇到的数据库连接难题是什么? 欢迎分享具体场景,我们将从架构设计层面分析解决方案,对于高并发场景下的连接泄露问题,是否有更优的实时检测方案?
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/19068.html
评论列表(3条)
读了这篇文章,我深有感触。作者对中连接的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是中连接部分,给了我很多新的思路。感谢分享这么好的内容!
读了这篇文章,我深有感触。作者对中连接的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!