在ASP.NET后台中从MSSQL数据库获取数据是开发Web应用的常见需求,通常通过ADO.NET、Entity Framework(EF)或Dapper等ORM框架实现,以下是详细步骤和代码示例,涵盖多种实现方式及注意事项。

使用ADO.NET直接操作数据库
ADO.NET是.NET框架提供的底层数据访问技术,适合需要精细控制数据库操作的场景,以下是核心步骤:
-
建立数据库连接
使用SqlConnection
类连接MSSQL数据库,需配置连接字符串(Web.config中定义):<connectionStrings> <add name="MyDbConnection" connectionString="Server=服务器名;Database=数据库名;User Id=用户名;Password=密码;" providerName="System.Data.SqlClient"/> </connectionStrings>
-
执行SQL查询
通过SqlCommand
执行SQL语句,并用SqlDataReader
读取结果:using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDbConnection"].ConnectionString)) { conn.Open(); string sql = "SELECT Id, Name, Age FROM Users WHERE Age > @Age"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@Age", 18); // 参数化查询防止SQL注入 using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { int id = reader.GetInt32(0); string name = reader.GetString(1); int age = reader.GetInt32(2); // 处理数据逻辑 } } }
使用Entity Framework(EF) Core
EF Core是微软推荐的高效ORM框架,支持LINQ查询和数据库迁移。

-
配置DbContext
定义继承自DbContext
的类,并配置实体与表的映射:public class MyDbContext : DbContext { public DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(Configuration.GetConnectionString("MyDbConnection")); } }
-
依赖注入与数据查询
在Startup.cs中注册DbContext,然后在Controller中通过构造函数注入:public class UserController : Controller { private readonly MyDbContext _context; public UserController(MyDbContext context) { _context = context; } public IActionResult GetUsers() { var users = _context.Users.Where(u => u.Age > 18).ToList(); return Json(users); } }
使用Dapper轻量级ORM
Dapper性能接近原生ADO.NET,同时简化了数据映射代码。
-
安装Dapper包
通过NuGet安装Dapper
和System.Data.SqlClient
。(图片来源网络,侵删) -
查询数据示例
using System.Data.SqlClient; using Dapper; public IEnumerable<User> GetUsers() { using (SqlConnection conn = new SqlConnection(connectionString)) { string sql = "SELECT * FROM Users WHERE Age > @Age"; return conn.Query<User>(sql, new { Age = 18 }); } }
数据操作优化建议
-
异步操作
使用async/await
避免线程阻塞,var users = await _context.Users.Where(u => u.Age > 18).ToListAsync();
-
连接池管理
确保连接字符串启用Pooling=true
(默认开启),避免频繁创建连接。 -
事务处理
多表操作时使用TransactionScope
确保数据一致性:using (var transaction = conn.BeginTransaction()) { cmd.Transaction = transaction; // 执行多个SQL命令 transaction.Commit(); }
-
性能监控
使用SQL Server Profiler或EF Core的日志功能分析慢查询。
常见错误处理
- 连接超时:检查网络或调整
Connection Timeout
参数。 - SQL注入:始终使用参数化查询而非字符串拼接。
- 实体映射错误:确保EF中实体属性与数据库列名匹配(可通过
[Column]
特性指定)。
相关问答FAQs
Q1: 如何处理数据库连接池耗尽的问题?
A1: 连接池耗尽通常因未正确释放连接导致,解决方案包括:
- 使用
using
语句确保SqlConnection
及时释放; - 检查是否存在未提交的事务(长时间运行的事务会占用连接);
- 调整连接池大小(
Max Pool Size
参数),但需根据服务器资源合理设置。
Q2: EF Core中如何优化复杂查询性能?
A2: 优化方法包括:
- 使用
AsNoTracking()
避免跟踪实体变更(适合只读查询); - 通过
Include
或ThenInclude
预加载关联数据,减少N+1查询问题; - 编写原生SQL查询(
FromSqlRaw
)替代复杂LINQ; - 对频繁查询的列建立数据库索引。