ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

C#与SQL Server数据库交互实战指南

C#与SQL Server数据库交互实战指南 1. 项目概述在软件开发领域数据库交互是几乎所有应用程序的核心功能之一。作为一名长期使用C#进行企业级开发的工程师我深刻理解与SQL Server数据库建立高效、可靠连接的重要性。C#作为.NET平台的主力语言与SQL Server这对黄金搭档在企业应用中占据着不可替代的地位。无论是开发ERP系统、电商平台还是数据分析工具掌握C#与SQL Server的交互技术都是.NET开发者的基本功。本文将基于我多年实战经验系统讲解从基础连接到高级应用的全套技术方案包含大量生产环境中验证过的代码示例和性能优化技巧。2. 环境准备与基础配置2.1 开发环境搭建首先需要准备以下环境组件Visual Studio 2022社区版即可SQL Server 2019/2022 Developer Edition.NET 6 SDK安装SQL Server时需特别注意选择混合模式身份验证记下设置的sa密码安装SQL Server Management Studio(SSMS)作为管理工具提示开发环境建议使用LocalDB轻量版可通过Visual Studio安装器直接添加该组件2.2 创建示例数据库在SSMS中执行以下SQL创建测试环境CREATE DATABASE CSharpDemo; GO USE CSharpDemo; GO CREATE TABLE Products ( ProductID INT PRIMARY KEY IDENTITY, ProductName NVARCHAR(100) NOT NULL, Price DECIMAL(10,2) CHECK (Price 0), Stock INT DEFAULT 0, CreatedDate DATETIME DEFAULT GETDATE() ); INSERT INTO Products (ProductName, Price, Stock) VALUES (Laptop, 999.99, 10), (Mouse, 19.99, 50), (Keyboard, 49.99, 30);3. 基础连接与CRUD操作3.1 连接字符串配置现代.NET推荐使用配置方式管理连接字符串。在appsettings.json中添加{ ConnectionStrings: { DefaultConnection: Server(localdb)\\MSSQLLocalDB;DatabaseCSharpDemo;Integrated Securitytrue; } }安全建议生产环境应使用Windows身份验证敏感信息应使用Secret Manager或Azure Key Vault连接字符串中可添加EncryptTrue启用TLS加密3.2 ADO.NET基础操作以下是完整的CRUD示例using System.Data.SqlClient; // 插入数据 public static void AddProduct(string name, decimal price) { using var connection new SqlConnection( ConfigurationManager.ConnectionStrings[DefaultConnection].ConnectionString); var command new SqlCommand( INSERT INTO Products (ProductName, Price) VALUES (name, price);, connection); command.Parameters.AddWithValue(name, name); command.Parameters.AddWithValue(price, price); connection.Open(); command.ExecuteNonQuery(); } // 查询数据 public static ListProduct GetProducts() { var products new ListProduct(); using var connection new SqlConnection( ConfigurationManager.ConnectionStrings[DefaultConnection].ConnectionString); var command new SqlCommand(SELECT * FROM Products, connection); connection.Open(); using var reader command.ExecuteReader(); while (reader.Read()) { products.Add(new Product { Id reader.GetInt32(0), Name reader.GetString(1), Price reader.GetDecimal(2), Stock reader.GetInt32(3) }); } return products; }重要务必使用using语句确保连接及时释放避免资源泄漏4. 高级数据访问技术4.1 Entity Framework Core实战现代.NET开发推荐使用EF Core作为ORM框架。首先安装NuGet包dotnet add package Microsoft.EntityFrameworkCore.SqlServer定义DbContext和实体类public class AppDbContext : DbContext { public DbSetProduct Products { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) options.UseSqlServer(YourConnectionString); } public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public int Stock { get; set; } }基本操作示例// 插入 using var db new AppDbContext(); db.Products.Add(new Product { Name Monitor, Price 199.99m }); db.SaveChanges(); // 查询 var cheapProducts db.Products .Where(p p.Price 100) .OrderBy(p p.Price) .ToList();4.2 存储过程调用对于复杂业务逻辑建议使用存储过程CREATE PROCEDURE sp_GetProductsByPriceRange minPrice DECIMAL(10,2), maxPrice DECIMAL(10,2) AS BEGIN SELECT * FROM Products WHERE Price BETWEEN minPrice AND maxPrice ORDER BY Price DESC; ENDC#调用方式using var command new SqlCommand(sp_GetProductsByPriceRange, connection); command.CommandType CommandType.StoredProcedure; command.Parameters.AddWithValue(minPrice, 10); command.Parameters.AddWithValue(maxPrice, 100); connection.Open(); using var reader command.ExecuteReader();5. 性能优化与安全实践5.1 连接池管理SQL Server默认启用连接池但需注意连接字符串完全相同才会复用池大小默认100可通过Max Pool Size调整及时关闭连接使用using语句5.2 参数化查询绝对避免字符串拼接SQL// 错误示范SQL注入风险 var command new SqlCommand( $SELECT * FROM Users WHERE Name {userInput}); // 正确做法 var command new SqlCommand( SELECT * FROM Users WHERE Name name); command.Parameters.AddWithValue(name, userInput);5.3 批量操作优化使用SqlBulkCopy进行大数据量导入using var bulkCopy new SqlBulkCopy(connection); bulkCopy.DestinationTableName Products; bulkCopy.WriteToServer(dataTable); // 或IDataReaderEF Core批量插入扩展库dotnet add package EFCore.BulkExtensions使用方式context.BulkInsert(products);6. 常见问题排查6.1 连接问题错误A network-related or instance-specific error...检查SQL Server服务是否运行验证连接字符串中的服务器名称检查防火墙设置6.2 超时问题错误Timeout expired...增加CommandTimeout默认30秒command.CommandTimeout 120;优化查询性能添加索引考虑分页处理大数据集6.3 并发冲突EF Core处理并发public class Product { [ConcurrencyCheck] public int Stock { get; set; } }捕获DbUpdateConcurrencyException异常处理冲突。7. 实际项目经验分享在企业级应用中我总结出以下最佳实践分层架构将数据访问层(DAL)与业务逻辑分离使用Repository模式封装数据访问异步编程所有数据库操作都应使用async/awaitpublic async TaskListProduct GetProductsAsync() { return await db.Products.ToListAsync(); }日志记录记录重要操作的执行时间和参数健康检查实现数据库连接的健康检查端点对于高并发场景建议使用Dapper作为轻量级ORM实现缓存策略Redis或MemoryCache考虑读写分离架构在最近的一个电商项目中通过优化数据库交互我们将关键API的响应时间从800ms降低到了120ms。主要措施包括使用AsNoTracking()减少EF Core开销批量处理订单创建操作优化N1查询问题
返回列表