在.NET应用程序中连接数据库是开发过程中的核心环节,不同场景下可选择多种连接方式,如ADO.NET、Entity Framework Core、Dapper等,本文将详细介绍.NET连接数据库的主流方法、配置步骤及最佳实践,帮助开发者高效实现数据交互。

ADO.NET原生连接方式
ADO.NET是.NET框架提供的底层数据访问技术,具有高性能和灵活性,适合需要精细控制数据库操作的场景。
基本连接流程
- 添加命名空间:在代码文件顶部引入
System.Data和特定数据库的命名空间(如SQL Server使用System.Data.SqlClient)。 - 创建连接字符串:包含服务器地址、数据库名称、认证信息等关键参数,示例:
string connectionString = "Server=.;Database=TestDB;Integrated Security=True;";
- 建立连接:使用
SqlConnection对象并调用Open()方法。 - 执行命令:通过
SqlCommand对象执行SQL语句或存储过程。 - 处理结果:使用
SqlDataReader读取查询结果,或通过ExecuteNonQuery执行增删改操作。
参数化查询防止SQL注入
为避免安全风险,建议使用参数化查询:
string query = "SELECT * FROM Users WHERE Username=@username AND Password=@password";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.Parameters.AddWithValue("@username", "admin");
cmd.Parameters.AddWithValue("@password", "123456");
// 执行命令
} 连接池优化
ADO.NET默认启用连接池,可通过连接字符串参数调整:

Pooling=True/False:启用或禁用连接池。Max Pool Size:设置最大连接数(默认100)。Min Pool Size:设置最小连接数。
Entity Framework Core(ORM框架)
Entity Framework Core(EF Core)是微软推荐的对象关系映射(ORM)框架,简化了数据库操作,支持多种数据库 provider。
配置步骤
- 安装NuGet包:根据数据库类型安装对应包(如
Microsoft.EntityFrameworkCore.SqlServer)。 - 定义DbContext:创建继承自
DbContext的类,配置实体集:public class AppDbContext : DbContext { public DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Server=.;Database=TestDB;Trusted_Connection=True;"); } } - 数据库迁移:通过
Add-Migration和Update-Database命令创建和更新数据库结构。
常用操作示例
- 查询数据:
using (var context = new AppDbContext()) { var users = context.Users.Where(u => u.Age > 18).ToList(); } - 添加数据:
context.Users.Add(new User { Name = "张三", Age = 25 }); context.SaveChanges();
性能优化策略
- 异步操作:使用
ToListAsync()、SaveChangesAsync()避免阻塞线程。 - 延迟加载与贪婪加载:通过
Include()预加载关联数据,减少查询次数。 - 批量操作:使用
AddRange()或EF.BulkExtensions库提升批量插入/更新效率。
轻量级ORM:Dapper
Dapper是一个高性能的微ORM框架,专注于扩展IDbConnection接口,执行原生SQL语句。
基本用法
- 安装NuGet包:
Dapper。 - 查询示例:
using (var connection = new SqlConnection(connectionString)) { var users = connection.Query<User>("SELECT * FROM Users WHERE Age>@age", new { age = 18 }); } - 执行非查询操作:
int affectedRows = connection.Execute("UPDATE Users SET Name=@name WHERE Id=@id", new { name = "李四", id = 1 });
多映射与多结果集
Dapper支持复杂查询结果的映射:

var sql = "SELECT * FROM Users; SELECT * from Roles;";
using (var multi = connection.QueryMultiple(sql))
{
var users = multi.Read<User>().ToList();
var roles = multi.Read<Role>().ToList();
} 不同数据库的连接配置
| 数据库类型 | NuGet包 | 连接字符串示例 |
|---|---|---|
| SQL Server | Microsoft.EntityFrameworkCore.SqlServer | Server=.;Database=DB;Trusted_Connection=True; |
| MySQL | MySql.Data | Server=localhost;Database=DB;Uid=root;Pwd=123; |
| PostgreSQL | Npgsql | Host=localhost;Database=DB;Username=postgres;Password=123; |
| SQLite | Microsoft.EntityFrameworkCore.Sqlite | Data Source=|DataDirectory|DB.db |
最佳实践
- 使用依赖注入:通过
IServiceCollection注册DbContext或IDbConnection,实现解耦。 - 配置管理:将连接字符串存储在
appsettings.json中,通过IConfiguration读取,避免硬编码。 - 异常处理:捕获
SqlException或DbUpdateException,记录日志并返回友好错误信息。 - 事务管理:使用
TransactionScope或EF Core的DbContext.Database.BeginTransaction()确保数据一致性。
相关问答FAQs
Q1: 如何在.NET Core中实现多数据库连接?
A: 可通过DbContext继承和依赖注入实现,创建多个DbContext类,分别配置不同的连接字符串,并在Startup.cs中注册为服务:
services.AddDbContext<DbContext1>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Db1")));
services.AddDbContext<DbContext2>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Db2"))); Q2: 连接数据库时“登录失败,用户名或密码错误”如何排查?
A: 按以下步骤检查:
- 确认连接字符串中的用户名、密码、数据库名称是否正确;
- 检查数据库是否允许远程连接(SQL Server需启用“TCP/IP协议”);
- 验证数据库用户是否有相应权限;
- 使用
ping或telnet测试数据库服务器端口是否可达(如SQL Server默认1433端口)。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复