news 2026/5/9 10:08:11

C#与SQL Server

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#与SQL Server

C#和SQL Server是微软技术栈中非常经典的一对组合,C#作为编程语言负责应用程序的逻辑,SQL Server作为数据库负责数据的存储和管理。

核心交互方式

C#程序与SQL Server通信,主要通过ADO.NET或基于它的各种ORM框架。

1、ADO.NET(原生方式)

使用System.Data.SqlCkient命名空间下的类(现代.NET使用Microsoft.Data.SqlClient)。

using Microsoft.Data.SqlClient;

string connectionString = "Server=localhost;Database=MyDB;User Id=sa;Password=YourPassword;TrustServerCertificate=True;";

// 查询数据
using (var conn = new SqlConnection(connectionString))
{
string sql = "SELECT Id, Name FROM Users WHERE Age > @Age";
var cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@Age", 18);

conn.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetInt32(0);
string name = reader.GetString(1);
Console.WriteLine($"{id}: {name}");
}
}
}

// 执行增删改
using (var conn = new SqlConnection(connectionString))
{
string sql = "INSERT INTO Users (Name, Age) VALUES (@Name, @Age)";
var cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@Name", "张三");
cmd.Parameters.AddWithValue("@Age", 25);

conn.Open();
int rowsAffected = cmd.ExecuteNonQuery();
}

关键点:

始终使用参数化查询防止SQL注入(上面的@Age、@Name)。

用using语句确保连接和命令对象被正确释放。

使用Microsoft.Data.SqlClient(微软官方新库)替代老的System.Data.SqlClient

2. ORM 框架(更高效开发)

Entity Framework Core(EF Core)—— 官方首选

将数据库表映射为 C# 类,用 LINQ 查询。

// 定义实体
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}

// DbContext
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer("Server=...");
}

// 使用 LINQ 查询
using var context = new AppDbContext();
var adults = context.Users.Where(u => u.Age > 18).ToList();

// 插入
context.Users.Add(new User { Name = "李四", Age = 30 });
context.SaveChanges();

优点:不用写 SQL,自动处理连接、事务、变更跟踪。
适用:大多数业务应用,特别是 CRUD 为主的项目。

Dapper(轻量级 ORM)

接近原生 ADO.NET 性能,同时简化了对象映射。

using Dapper;

using (var conn = new SqlConnection(connectionString))
{
var users = conn.Query<User>("SELECT * FROM Users WHERE Age > @Age", new { Age = 18 });
conn.Execute("INSERT INTO Users (Name, Age) VALUES (@Name, @Age)", new { Name = "王五", Age = 22 });
}

适合:对性能要求极高,或需要写复杂 SQL 的场景。

连接与配置

连接字符串常见写法

// Windows 身份验证
"Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;TrustServerCertificate=True;"

// SQL Server 身份验证
"Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;TrustServerCertificate=True;"

// 使用实例名
"Server=localhost\\SQLEXPRESS;Database=...;"

最佳实践:不要把连接字符串硬编码在代码中,应放在appsettings.json(.NET Core/6/8/9)或 Web.config(.NET Framework),并加密生产环境的敏感信息。

appsettings.json 示例

json

{ "ConnectionStrings": { "DefaultConnection": "Server=.;Database=MyDb;Trusted_Connection=True;TrustServerCertificate=True;" } }

读取方式:

csharp

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");

常见操作进阶

1. 存储过程调用

csharp

using (var cmd = new SqlCommand("usp_GetUsersByAge", conn)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@Age", 18); // ... }

2. 事务处理

csharp

using (var conn = new SqlConnection(connectionString)) { conn.Open(); using (var transaction = conn.BeginTransaction()) { try { // 执行多个数据库操作,都使用同一个 transaction 对象 transaction.Commit(); } catch { transaction.Rollback(); throw; } } }

EF Core 中则可以更简单地用context.Database.BeginTransactionAsync()

3. 异步操作(推荐)

csharp

using (var conn = new SqlConnection(connectionString)) { await conn.OpenAsync(); var cmd = new SqlCommand(sql, conn); using (var reader = await cmd.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { // ... } } }

性能与安全最佳实践

  1. 始终使用参数化查询(防 SQL 注入)。

  2. 尽早打开连接,尽快关闭(或用using自动释放)。

  3. 选择合适的数据读取方式

    • ExecuteReader→ 只读、只进流,性能最好。

    • ExecuteScalar→ 返回单值(如SELECT COUNT(*))。

    • ExecuteNonQuery→ 增删改。

  4. **避免 SELECT *** ,只取需要的列。

  5. 大量数据操作时考虑批量操作:使用SqlBulkCopy或 EF Core 的AddRange/ExecuteUpdate(EF Core 7+)。

  6. 连接池:ADO.NET 默认启用连接池,不用特别处理,但务必关闭连接。

  7. 敏感信息:生产环境连接字符串用 Azure Key Vault、环境变量或配置加密。

常见错误与排查

  • 超时错误:增加CommandTimeout;优化 SQL 或索引。

  • 连接泄漏:确保所有SqlConnection都 Dispose 了(用using)。

  • 已关闭的连接:操作前检查conn.State,需要时Open

  • 找不到 SQL Server 实例:检查连接字符串Server.代表本机默认实例,.\SQLEXPRESS代表命名实例)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 10:08:10

内容创作团队如何利用 Taotoken 聚合不同模型特长提升稿件生成效率

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 内容创作团队如何利用 Taotoken 聚合不同模型特长提升稿件生成效率 在内容创作团队的实际工作中&#xff0c;一篇高质量的稿件往往…

作者头像 李华
网站建设 2026/5/9 10:05:36

Cursor编辑器配置同步方案:基于Git与Shell脚本实现开发环境无缝漫游

1. 项目概述&#xff1a;一个为 Cursor 编辑器量身定制的配置同步方案如果你和我一样&#xff0c;是一个重度依赖 Cursor 这款“AI 原生”代码编辑器的开发者&#xff0c;那你一定遇到过这个痛点&#xff1a;辛辛苦苦在办公室的电脑上配置好了顺手的主题、快捷键、代码片段、AI…

作者头像 李华
网站建设 2026/5/9 10:01:31

Docker化部署OpenClaw爬虫:一键解决环境依赖与跨平台运行难题

1. 项目概述与核心价值最近在折腾一个名为 OpenClaw 的开源项目&#xff0c;它本质上是一个功能强大的网络爬虫与数据采集框架。如果你和我一样&#xff0c;经常需要从各种网站、API 或数据源中自动化地抓取、清洗和存储数据&#xff0c;那么 OpenClaw 绝对是一个值得深入研究的…

作者头像 李华
网站建设 2026/5/9 10:00:29

自建ChatGPT Web客户端:从零部署到深度定制全攻略

1. 项目概述&#xff1a;一个开源的Web版ChatGPT客户端最近在折腾AI应用部署的时候&#xff0c;发现了一个挺有意思的开源项目&#xff0c;叫dqzboy/chatgpt-web。简单来说&#xff0c;这是一个让你能在自己的服务器上&#xff0c;快速搭建一个类似ChatGPT官方网页版体验的Web应…

作者头像 李华
网站建设 2026/5/9 9:57:50

如何高效实现小说资源自动化采集:Rust开源方案深度解析

如何高效实现小说资源自动化采集&#xff1a;Rust开源方案深度解析 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 番茄小说下载器&#xff08;Tomato-Novel-Downloader&#…

作者头像 李华