上一篇
C数据库操作如何高效实现增删改查?最佳实践与解决方案分享
- 行业动态
- 2025-05-14
- 1
C#数据库增删改查程序基于ADO.NET框架实现,通过SqlConnection建立数据库连接,使用SqlCommand执行SQL语句或存储过程,封装了数据查询、插入、更新和删除操作,利用参数化查询防止SQL注入,采用try-catch异常处理机制保障数据安全,适用于WinForm或ASP.NET等应用开发场景。
在C#中实现数据库的增删改查(CRUD)操作是开发Web应用的核心技能之一,本文将以SQL Server数据库为例,结合参数化查询、异常处理和安全规范,提供可直接部署到生产环境的代码示例。
环境准备
安装NuGet包
通过Visual Studio安装以下组件:
- System.Data.SqlClient
- Dapper(可选ORM工具)
- 配置连接字符串
在Web.config中配置:<configuration> <connectionStrings> <add name="DBConn" connectionString="Server=.;Database=DemoDB;User Id=sa;Password=YourPassword;" providerName="System.Data.SqlClient"/> </connectionStrings> </configuration>
数据库连接类
using System.Data.SqlClient; using System.Configuration; public class DbHelper { private static readonly string connString = ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString; public static SqlConnection GetConnection() { return new SqlConnection(connString); } }
增删改查实现
创建数据(Create)
public int CreateUser(User user) { const string sql = @" INSERT INTO Users (Name, Email, CreateDate) VALUES (@Name, @Email, @CreateDate)"; using (var conn = DbHelper.GetConnection()) { conn.Open(); using (var cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@Name", user.Name); cmd.Parameters.AddWithValue("@Email", user.Email); cmd.Parameters.AddWithValue("@CreateDate", DateTime.Now); return cmd.ExecuteNonQuery(); } } }
查询数据(Read)
public List<User> GetUsers() { var users = new List<User>(); const string sql = "SELECT UserId, Name, Email FROM Users"; using (var conn = DbHelper.GetConnection()) { conn.Open(); using (var cmd = new SqlCommand(sql, conn)) { var reader = cmd.ExecuteReader(); while (reader.Read()) { users.Add(new User { UserId = (int)reader["UserId"], Name = reader["Name"].ToString(), Email = reader["Email"].ToString() }); } } } return users; }
更新数据(Update)
public int UpdateUser(User user) { const string sql = @" UPDATE Users SET Name = @Name, Email = @Email WHERE UserId = @UserId"; using (var conn = DbHelper.GetConnection()) { conn.Open(); using (var cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@UserId", user.UserId); cmd.Parameters.AddWithValue("@Name", user.Name); cmd.Parameters.AddWithValue("@Email", user.Email); return cmd.ExecuteNonQuery(); } } }
删除数据(Delete)
public int DeleteUser(int userId) { const string sql = "DELETE FROM Users WHERE UserId = @UserId"; using (var conn = DbHelper.GetConnection()) { conn.Open(); using (var cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@UserId", userId); return cmd.ExecuteNonQuery(); } } }
进阶实践
事务处理
public void TransactionDemo() { using (var conn = DbHelper.GetConnection()) { conn.Open(); using (var transaction = conn.BeginTransaction()) { try { // 执行多个操作 transaction.Commit(); } catch { transaction.Rollback(); throw; } } } }
异常处理规范
try { // 数据库操作 } catch (SqlException ex) when (ex.Number == 547) { // 处理外键约束错误 } catch (SqlException ex) { // 记录日志 Logger.Error($"数据库错误:{ex.Message}"); throw new CustomDbException("数据操作失败,请稍后重试"); }
安全建议
- 始终使用参数化查询
- 最小化数据库账号权限
- 敏感数据加密存储
- 定期备份数据库
- 使用存储过程替代动态SQL
性能优化
- 连接池配置
- 索引优化
- 分页查询实现
- 异步操作支持
- 缓存常用查询结果
参考文献:
- Microsoft ADO.NET官方文档:https://learn.microsoft.com/zh-cn/dotnet/framework/data/adonet/
- OWASP SQL注入防护指南:https://owasp.org/www-community/attacks/SQL_Injection
- Stack Overflow 2025开发者调查报告数据库部分