当前位置:首页 > 行业动态 > 正文

C连接数据库时如何高效操作数据表格?

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 示例
    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 语句管理资源

  • 自动释放 SqlConnectionSqlCommand 等对象
  • 避免内存泄漏和数据库连接未关闭问题

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 等异步方法
    }
}

安全注意事项

  1. 永远不要拼接 SQL 字符串
    坚持使用参数化查询或 ORM 框架(如 Entity Framework Core)
  2. 最小权限原则
    数据库账号仅授予必要的操作权限
  3. 加密敏感信息
    连接字符串中的密码应通过配置管理器加密存储

性能优化建议

  • 使用存储过程处理复杂逻辑
  • 通过索引优化查询效率
  • 定期分析执行计划(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 年开发者调查报告
0