上一篇
如何用C高效访问数据库?
- 行业动态
- 2025-05-12
- 3
C#可通过ADO.NET、Entity Framework等工具访问数据库,ADO.NET提供基础类库执行SQL命令及操作数据;Entity Framework实现对象关系映射,简化数据交互,两者均支持SQL Server、MySQL等常见数据库,开发时需注意连接管理、参数化查询以保障安全与性能。
基础技术:ADO.NET
ADO.NET是C#访问数据库的传统方式,具备高性能和灵活性的特点。
连接数据库
使用SqlConnection
类建立连接,需配置连接字符串,示例代码:
string connectionString = "Server=myServer;Database=myDB;User Id=myUser;Password=myPass;"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // 执行数据库操作 }
- 关键点:
using
语句确保资源释放,避免内存泄漏。
执行SQL命令
通过SqlCommand
执行查询或存储过程:
string sql = "SELECT * FROM Users WHERE Age > @Age"; using (SqlCommand command = new SqlCommand(sql, connection)) { command.Parameters.AddWithValue("@Age", 18); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["Name"]); } } }
- 安全性:务必使用参数化查询,防止SQL注入攻击。
事务处理
通过SqlTransaction
保证数据一致性:
using (SqlTransaction transaction = connection.BeginTransaction()) { try { SqlCommand cmd1 = new SqlCommand("UPDATE Accounts SET Balance = Balance - 100 WHERE Id = 1", connection, transaction); SqlCommand cmd2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE Id = 2", connection, transaction); cmd1.ExecuteNonQuery(); cmd2.ExecuteNonQuery(); transaction.Commit(); } catch { transaction.Rollback(); } }
高效开发:Entity Framework Core
Entity Framework(EF)是微软推出的ORM框架,简化数据库操作。
定义数据模型
public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } public class AppDbContext : DbContext { public DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Server=myServer;Database=myDB;User Id=myUser;Password=myPass;"); } }
增删改查操作
using (var context = new AppDbContext()) { // 查询 var users = context.Users.Where(u => u.Age > 18).ToList(); // 新增 context.Users.Add(new User { Name = "Alice", Age = 25 }); context.SaveChanges(); // 更新 var user = context.Users.Find(1); user.Name = "Bob"; context.SaveChanges(); // 删除 context.Users.Remove(user); context.SaveChanges(); }
数据库迁移
通过EF Core命令行工具实现数据库结构版本控制:
dotnet ef migrations add InitialCreate dotnet ef database update
安全与性能优化
防御安全威胁
- SQL注入:始终使用参数化查询或ORM框架。
- 连接泄露:确保及时关闭数据库连接。
提升性能
- 连接池:默认启用,避免频繁创建/销毁连接。
- 异步操作:使用
async/await
提高吞吐量。public async Task<List<User>> GetUsersAsync() { using (var context = new AppDbContext()) { return await context.Users.Where(u => u.Age > 18).ToListAsync(); } }
技术选型建议
- 小型项目或高性能场景:选择ADO.NET,直接控制SQL语句。
- 中大型项目或快速开发:优先使用Entity Framework Core,减少重复代码。
参考资料
- Microsoft ADO.NET官方文档:https://learn.microsoft.com/zh-cn/dotnet/framework/data/adonet/
- Entity Framework Core指南:https://learn.microsoft.com/zh-cn/ef/core/
- SQL注入防御规范:OWASP SQL Injection Prevention Cheat Sheet