上一篇
C连接数据库时如何高效操作数据表格?
- 行业动态
- 2025-05-11
- 11
C#可通过ADO.NET或ORM框架(如Entity Framework)连接数据库,操作表格数据,使用SqlConnection建立数据库连接,配置连接字符串后,通过SqlCommand执行SQL查询或存储过程,利用DataAdapter填充DataSet/DataTable实现离线数据处理,确保资源释放与异常处理以保证稳定性和安全性。
数据库连接基础
1 准备工作
安装数据库驱动
根据数据库类型选择对应的 NuGet 包:- SQL Server:
System.Data.SqlClient
- MySQL:
MySql.Data
(官方推荐使用MySqlConnector
,性能更优)
- SQL Server:
连接字符串格式
// SQL Server 示例 string connectionString = "Server=服务器地址;Database=数据库名;User Id=用户名;Password=密码;"; // MySQL 示例 string mysqlConnectionString = "Server=服务器地址;Database=数据库名;Uid=用户名;Pwd=密码;";
2 建立连接的完整流程
using System.Data.SqlClient; // SQL Server 命名空间 public void ConnectToDatabase() { string connectionString = "Server=.;Database=TestDB;Integrated Security=True;"; // 本地集成验证 using (SqlConnection connection = new SqlConnection(connectionString)) { try { connection.Open(); Console.WriteLine("数据库连接成功!"); // 执行后续操作... } catch (Exception ex) { Console.WriteLine($"连接失败:{ex.Message}"); } } }
表格数据操作(CRUD)
1 查询数据(SELECT)
public List<User> GetUsers() { List<User> users = new List<User>(); string query = "SELECT UserId, UserName, Email FROM Users"; using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(query, connection); connection.Open(); SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { users.Add(new User { Id = reader.GetInt32(0), Name = reader.GetString(1), Email = reader.GetString(2) }); } reader.Close(); } return users; }
2 插入数据(INSERT)
重要提示:务必使用参数化查询防止 SQL 注入
public int AddUser(User user) { string query = "INSERT INTO Users (UserName, Email) VALUES (@Name, @Email)"; using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(query, connection); command.Parameters.AddWithValue("@Name", user.Name); command.Parameters.AddWithValue("@Email", user.Email); connection.Open(); return command.ExecuteNonQuery(); // 返回受影响行数 } }
3 更新与删除(UPDATE/DELETE)
// 更新示例 string updateQuery = "UPDATE Users SET Email = @NewEmail WHERE UserId = @Id"; command.Parameters.AddWithValue("@NewEmail", "new@example.com"); command.Parameters.AddWithValue("@Id", 1001); // 删除示例 string deleteQuery = "DELETE FROM Users WHERE UserId = @Id";
高级技巧与最佳实践
1 使用 using
语句管理资源
- 自动释放
SqlConnection
、SqlCommand
等对象 - 避免内存泄漏和数据库连接未关闭问题
2 异常处理规范
try { // 数据库操作代码 } catch (SqlException ex) { // 记录特定错误(如登录失败、超时等) Logger.LogError($"数据库错误 {ex.Number}: {ex.Message}"); } catch (Exception ex) { // 通用异常处理 }
3 连接池优化
- 默认启用连接池(可通过连接字符串配置)
Pooling=true; Max Pool Size=100; Min Pool Size=10;
4 异步操作(推荐用于 Web 场景)
public async Task<List<User>> GetUsersAsync() { using (SqlConnection connection = new SqlConnection(connectionString)) { await connection.OpenAsync(); // 使用 ExecuteReaderAsync 等异步方法 } }
安全注意事项
- 永远不要拼接 SQL 字符串
坚持使用参数化查询或 ORM 框架(如 Entity Framework Core) - 最小权限原则
数据库账号仅授予必要的操作权限 - 加密敏感信息
连接字符串中的密码应通过配置管理器加密存储
性能优化建议
- 使用存储过程处理复杂逻辑
- 通过索引优化查询效率
- 定期分析执行计划(SQL Server Profiler 或 EXPLAIN 语句)
- 批量操作建议使用
SqlBulkCopy
常见问题解答
Q:连接时出现 Timeout expired
错误?
A:检查网络是否畅通,适当增加连接字符串中的超时设置:Connection Timeout=30;
Q:如何解决 The connection was not closed
警告?
A:确保所有连接都在 using
块中或显式调用 Close()
引用说明参考以下权威资料:
- Microsoft 官方文档《ADO.NET 概述》
- MySQL Connector/NET 开发者指南
- OWASP SQL 注入防护指南
- Stack Overflow 2025 年开发者调查报告