ASP.NET 数据库连接实战指南
ASP.NET 挂载数据库的核心方法是:通过 ADO.NET 或 ORM 框架(如 Entity Framework)建立连接,执行 SQL 命令或操作实体对象实现数据交互。 关键在于正确配置连接字符串、管理连接生命周期并实施安全措施。

ADO.NET:基础高效的数据库连接方式
ADO.NET 是 .NET 平台访问数据库的基石,提供直接且高性能的操作能力。
-
建立数据库连接
- 引用命名空间:
using System.Data.SqlClient; // 适用于 SQL Server // 或 using Microsoft.Data.SqlClient; // 推荐较新项目
- 构建连接字符串: 包含服务器地址、数据库名、认证信息等关键参数。
string connectionString = "Server=your_server_name;Database=your_db_name;User Id=your_username;Password=your_strong_password;"; // 或使用集成安全: "Server=.;Database=Northwind;Integrated Security=True;"
- 创建并使用 SqlConnection 对象: 使用
using语句确保连接自动关闭释放。using (SqlConnection connection = new SqlConnection(connectionString)) { try { connection.Open(); // 显式打开连接 // 在此执行数据库操作 (查询、插入、更新、删除) } catch (SqlException ex) { // 处理数据库连接或操作异常 } // connection.Close(); // using 块结束时会自动调用 Close() }
- 引用命名空间:
-
执行数据库操作
-
SqlCommand 对象: 用于执行 SQL 语句或存储过程。
string sql = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = @Country"; using (SqlCommand command = new SqlCommand(sql, connection)) { // 参数化查询(防止SQL注入) command.Parameters.AddWithValue("@Country", "USA"); // 执行查询并获取结果 using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { string customerId = reader["CustomerID"].ToString(); string companyName = reader["CompanyName"].ToString(); // 处理数据... } } } -
其他 Execute 方法:
ExecuteNonQuery(): 执行 INSERT, UPDATE, DELETE, 返回受影响行数。ExecuteScalar(): 执行查询并返回结果集中第一行第一列的值。
-
Entity Framework Core:现代ORM解决方案
Entity Framework (EF) Core 是微软官方推荐的 ORM 框架,将数据库表映射为 .NET 对象,极大简化数据访问。
-
安装与配置

-
NuGet 安装: 根据数据库类型安装对应包 (如
Microsoft.EntityFrameworkCore.SqlServer)。 -
定义 DbContext: 核心类,代表与数据库的会话。
public class AppDbContext : DbContext { public DbSet<Customer> Customers { get; set; } // 映射到 Customers 表 public DbSet<Order> Orders { get; set; } // 映射到 Orders 表 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Your_Connection_String_Here"); } } -
定义实体类: 对应数据库表结构。
public class Customer { public int CustomerID { get; set; } public string CompanyName { get; set; } public string Country { get; set; } // ... 其他属性和导航属性 (如 public List<Order> Orders { get; set; }) }
-
-
执行数据操作
-
依赖注入 DbContext (推荐): 在
Startup.cs中配置:public void ConfigureServices(IServiceCollection services) { services.AddDbContext<AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); // ... 其他服务 } -
在控制器/服务中使用:
public class CustomerController : Controller { private readonly AppDbContext _context; public CustomerController(AppDbContext context) // 依赖注入 { _context = context; } public IActionResult Index() { var customersInUSA = _context.Customers .Where(c => c.Country == "USA") .ToList(); // 查询转换为列表 return View(customersInUSA); } [HttpPost] public IActionResult Create(Customer customer) { if (ModelState.IsValid) { _context.Customers.Add(customer); // 添加新实体 _context.SaveChanges(); // 提交更改到数据库 return RedirectToAction("Index"); } return View(customer); } // ... 更新、删除操作类似 (Find/Update/SaveChanges, Remove/SaveChanges) }
-
关键实践与安全要点
-
连接字符串安全

- 绝不硬编码: 将连接字符串存储在配置文件(
appsettings.json)或安全存储中。// appsettings.json { "ConnectionStrings": { "DefaultConnection": "Server=...;Database=...;User Id=...;Password=...;" } } - 访问配置:
string connString = Configuration.GetConnectionString("DefaultConnection"); - 保护敏感数据: 生产环境使用 Azure Key Vault 或环境变量存储凭据。
- 绝不硬编码: 将连接字符串存储在配置文件(
-
参数化查询
- 杜绝 SQL 注入: 无论使用 ADO.NET (
SqlParameter) 还是 EF Core (自动处理),必须强制使用参数化查询,禁止拼接 SQL 字符串。// ADO.NET 正确做法 (前文示例) command.Parameters.AddWithValue("@Country", userInputCountry);
- 杜绝 SQL 注入: 无论使用 ADO.NET (
-
连接管理优化
- 连接池: ADO.NET 和 EF Core 默认启用连接池,重用物理连接,提升性能,保持连接字符串一致以利用池化。
- 及时释放资源: 务必使用
using语句包裹SqlConnection,SqlCommand,SqlDataReader,DbContext等对象,确保及时释放数据库连接和资源。 - 异步操作: 对于 I/O 密集操作,使用
OpenAsync(),ExecuteReaderAsync(),ToListAsync(),SaveChangesAsync()等方法提升应用吞吐量和响应能力。
-
错误处理
- 结构化异常处理: 使用
try-catch捕获特定异常(如SqlException,DbUpdateException),记录详细信息,并向用户返回友好错误提示,避免暴露敏感信息。
- 结构化异常处理: 使用
ADO.NET vs. Entity Framework Core:如何选择?
- 选择 ADO.NET 当:
- 需要极致性能(微秒级优化)。
- 执行复杂、高度优化的 SQL 或存储过程。
- 项目结构简单,无需复杂对象关系映射。
- 对 SQL 有完全控制需求。
- 选择 Entity Framework Core 当:
- 追求开发效率和代码简洁性。
- 业务逻辑围绕领域模型设计。
- 需要进行复杂查询、变更跟踪、迁移管理。
- 数据库结构可能变化,需要 ORM 的灵活性支持。
- 利用 LINQ 进行强类型查询。
您在实际项目中更倾向于哪种数据库连接方式?是追求极致性能的 ADO.NET,还是侧重开发效率的 Entity Framework Core?欢迎在评论区分享您的经验和见解!
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/5336.html