跳转到主要内容
杨月昌的软件博客
返回

C# 操作 SQL Server 数据库:增、删、改、查基本操作

在 .NET 开发中,ADO.NET 是与 SQL Server 交互的基石。掌握底层的 SqlConnectionSqlCommand 等对象的操作,不仅能帮助你理解 ORM(如 EF Core)的原理,在处理高性能或轻量级任务时也更加得心应手。


1. 基础配置与命名空间

在 C# 中与 SQL Server 交互,必须引用核心驱动库:

using System;
using System.Data;
using Microsoft.Data.SqlClient; // 现代 .NET 建议使用此库,而非 System.Data.SqlClient

2. 数据库连接管理

核心原则: 数据库连接属于昂贵的资源。应遵循“晚开早关”原则,并始终使用 using 块确保即使发生异常也能释放连接池资源。

建议的连接方式

// 建议将连接字符串存放在配置文件中
private string _connectionString = "Server=.;Database=MyDb;User Id=sa;Password=your_password;";

/// <summary>
/// 测试连接状态
/// </summary>
public bool TestConnection()
{
    using (SqlConnection conn = new SqlConnection(_connectionString))
    {
        try
        {
            conn.Open();
            return true;
        }
        catch
        {
            return false;
        }
    } // 离开此代码块,conn 会自动 Close 和 Dispose
}

3. 执行 增、删、改(非查询操作)

对于 INSERTUPDATEDELETE,我们使用 ExecuteNonQuery注意: 绝对不要直接拼 SQL 字符串!必须使用参数化查询来防止 SQL 注入攻击

/// <summary>
/// 执行非查询 SQL
/// </summary>
public int ExecuteNonQuery(string sql, SqlParameter[] parameters = null)
{
    using (SqlConnection conn = new SqlConnection(_connectionString))
    {
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            if (parameters != null) cmd.Parameters.AddRange(parameters);
            conn.Open();
            return cmd.ExecuteNonQuery(); // 返回受影响的行数
        }
    }
}

// 调用示例
string sql = "UPDATE Users SET Name = @name WHERE Id = @id";
SqlParameter[] paras = {
    new SqlParameter("@name", "Gemini"),
    new SqlParameter("@id", 1)
};
int rows = ExecuteNonQuery(sql, paras);

4. 执行查询(获取数据集)

查询操作通常有两种返回形式:DataSet(离线数据集)或 SqlDataReader(只读向前的流)。

方式 A:使用 DataAdapter 填充 DataSet(适合小型数据集)

public DataSet GetDataSet(string sql, SqlParameter[] parameters = null)
{
    using (SqlConnection conn = new SqlConnection(_connectionString))
    {
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            if (parameters != null) cmd.Parameters.AddRange(parameters);
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            adapter.Fill(ds);
            return ds;
        }
    }
}

5. 进阶:异步操作(推荐)

在现代应用(尤其是 Web 或 UI 密集型应用)中,应优先使用异步方法,以防阻塞主线程。

public async Task<int> ExecuteNonQueryAsync(string sql)
{
    using (SqlConnection conn = new SqlConnection(_connectionString))
    {
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            await conn.OpenAsync();
            return await cmd.ExecuteNonQueryAsync();
        }
    }
}

💡 最佳实践总结

  1. 防止注入:始终使用 SqlParameter,永不使用 string.Format 拼接 SQL。
  2. 资源管理:强制使用 using 语句,它是处理 SqlConnection 的金科玉律。
  3. 异常处理:不要在底层库里简单地 return ex.Message。建议抛出异常或记录到日志(如 Log4Net/Serilog),由业务层决定如何响应用户。
  4. 连接字符串:将其保存在 appsettings.jsonweb.config 中,不要硬编码在代码里。


上一篇
WPF 实战:自定义圆角无边框窗体与交互操作详解
下一篇
C# 开发实战:深入理解 MD5 加密与用户密码保护