656 字
3 分钟
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 中,不要硬编码在代码里。
C# 操作 SQL Server 数据库:增、删、改、查基本操作
https://sw.rscclub.website/posts/csharpsqlservercrud/
作者
杨月昌
发布于
2019-11-18
许可协议
CC BY-NC-SA 4.0