在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; - 对频繁查询的列建立数据库索引。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/314796.html<
