上一篇
C直接操作数据库时如何避免常见错误?
- 行业动态
- 2025-05-12
- 9
C#通过ADO.NET和Entity Framework框架可直接操作数据库,支持连接管理、SQL执行及数据映射,实现高效CRUD操作,集成事务处理与参数化查询确保数据安全,兼容SQL Server/MySQL等多数据库,简化开发流程并提升数据处理可靠性。
数据库连接基础
选择数据库提供程序
C#通过System.Data.SqlClient
命名空间支持SQL Server,其他数据库(如MySQL、PostgreSQL)需安装对应NuGet包(如MySql.Data
、Npgsql
),示例代码:using (var connection = new SqlConnection(connectionString)) { await connection.OpenAsync(); // 后续操作 }
连接字符串管理
推荐将连接字符串存储在appsettings.json
或环境变量中,避免硬编码:{ "ConnectionStrings": { "Default": "Server=.;Database=DemoDB;Integrated Security=True;" } }
数据库操作实践
查询数据
使用参数化查询防止SQL注入:
public async Task<List<Product>> GetProductsAsync(int categoryId) { var products = new List<Product>(); using (var command = new SqlCommand()) { command.Connection = connection; command.CommandText = "SELECT Id, Name FROM Products WHERE CategoryId = @CategoryId"; command.Parameters.AddWithValue("@CategoryId", categoryId); using (var reader = await command.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { products.Add(new Product { Id = reader.GetInt32(0), Name = reader.GetString(1) }); } } } return products; }
插入与更新
利用ExecuteNonQueryAsync
执行写操作:
public async Task<int> CreateProductAsync(Product product) { using (var command = new SqlCommand( "INSERT INTO Products (Name, Price) VALUES (@Name, @Price); SELECT SCOPE_IDENTITY();", connection)) { command.Parameters.AddWithValue("@Name", product.Name); command.Parameters.AddWithValue("@Price", product.Price); return Convert.ToInt32(await command.ExecuteScalarAsync()); } }
事务处理
确保ACID特性:
using (var transaction = connection.BeginTransaction()) { try { // 执行多个命令 await command1.ExecuteNonQueryAsync(); await command2.ExecuteNonQueryAsync(); transaction.Commit(); } catch { transaction.Rollback(); throw; } }
性能与安全优化
连接池管理
ADO.NET默认启用连接池,需注意:- 及时释放连接(使用
using
语句) - 避免超过最大池大小(默认100)
- 及时释放连接(使用
异步编程模式
使用async/await
提升吞吐量:public async Task<User> GetUserAsync(int userId) { using (var command = new SqlCommand("...", connection)) { // 异步方法调用 using (var reader = await command.ExecuteReaderAsync()) { // 数据处理 } } }
防御性编程
- 验证输入参数(如非空校验、类型检查)
- 使用
Dapper
等轻量级ORM简化参数处理 - 记录异常日志(通过Serilog或NLog)
进阶方案:ORM与原生SQL的结合
虽然Entity Framework Core是主流ORM,但复杂场景仍需原生SQL:
// EF Core中执行原生SQL var products = context.Products .FromSqlRaw("SELECT * FROM Products WHERE Price > {0}", minPrice) .ToList(); // 使用Dapper简化映射 var users = await connection.QueryAsync<User>( "SELECT * FROM Users WHERE IsActive = @IsActive", new { IsActive = true });
符合E-A-T原则的关键实践
专业性
- 引用微软官方文档中的连接字符串规范
- 遵循OWASP SQL注入防护指南
权威性
- 使用NuGet官方认证的数据库驱动包
- 推荐Azure SQL Database作为云解决方案
可信度
- 在GitHub提供可验证的代码示例
- 通过Benchmark.NET展示性能对比数据
引用说明
- 微软ADO.NET文档:https://learn.microsoft.com/zh-cn/dotnet/framework/data/adonet/
- OWASP SQL注入防护指南:https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
- Dapper官方仓库:https://github.com/DapperLib/Dapper