上一篇
如何在C中高效实现服务器SQL数据库访问?
- 行业动态
- 2025-05-13
- 2
在C#中可通过ADO.NET或Entity Framework Core访问SQL Server数据库,使用SqlConnection建立连接,通过SqlCommand执行SQL语句或存储过程,建议采用参数化查询防止注入攻击,配合try-catch实现异常处理,完成数据查询、插入、更新等操作后需及时关闭连接释放资源。
环境准备
- 数据库配置:
确保已安装SQL Server(推荐使用2016及以上版本)并完成基本配置,创建数据库和表时,需设置合适的权限(如db_datareader
和db_datawriter
角色)。 - 开发工具:
使用Visual Studio(推荐2022版)或跨平台的.NET Core开发环境,安装NuGet包Microsoft.Data.SqlClient
(官方推荐库,替代旧的System.Data.SqlClient
)。
连接数据库
(1) 连接字符串
通过SqlConnection
类建立连接,推荐将连接字符串存储在配置文件(如appsettings.json
)中:
// appsettings.json { "ConnectionStrings": { "DefaultConnection": "Server=服务器地址;Database=数据库名;User Id=用户名;Password=密码;TrustServerCertificate=True;" } }
(2) 代码实现
using Microsoft.Data.SqlClient; using Microsoft.Extensions.Configuration; public class DatabaseService { private readonly string _connectionString; public DatabaseService(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } public void ConnectAndQuery() { using (SqlConnection connection = new SqlConnection(_connectionString)) { try { connection.Open(); string query = "SELECT TOP 10 * FROM Users"; using (SqlCommand command = new SqlCommand(query, connection)) { SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { Console.WriteLine(reader["UserName"].ToString()); } } } catch (SqlException ex) { Console.WriteLine($"数据库错误: {ex.Message}"); } } } }
安全与防注入
- 参数化查询:禁止拼接SQL语句,必须使用参数化查询:
string query = "INSERT INTO Products (Name, Price) VALUES (@Name, @Price)"; using (SqlCommand cmd = new SqlCommand(query, connection)) { cmd.Parameters.AddWithValue("@Name", productName); cmd.Parameters.AddWithValue("@Price", price); cmd.ExecuteNonQuery(); }
- 错误处理:
使用try-catch
捕获异常,记录日志但不暴露敏感信息(如数据库结构)。 - 加密连接:
启用SSL/TLS加密,在连接字符串中添加Encrypt=True
。
高效数据操作
(1) 异步编程
使用async/await
提升并发性能:
public async Task<List<User>> GetUsersAsync() { List<User> users = new List<User>(); using (SqlConnection connection = new SqlConnection(_connectionString)) { await connection.OpenAsync(); string query = "SELECT * FROM Users"; using (SqlCommand command = new SqlCommand(query, connection)) { SqlDataReader reader = await command.ExecuteReaderAsync(); while (await reader.ReadAsync()) { users.Add(new User { Id = reader.GetInt32(0), Name = reader.GetString(1) }); } } } return users; }
(2) 使用ORM框架
推荐使用Entity Framework Core简化操作:
public class AppDbContext : DbContext { public DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(_connectionString); } } // 查询示例 var users = await _context.Users.Where(u => u.IsActive).ToListAsync();
常见问题解决
问题场景 | 解决方案 |
---|---|
连接超时 | 调整连接字符串的Connect Timeout=30 |
权限不足 | 检查数据库用户角色和架构权限 |
连接池耗尽 | 增加Max Pool Size=100 或及时释放连接 |
中文字符乱码 | 确保数据库字符集为UTF-8 或NVARCHAR 字段 |
最佳实践
- 连接管理:
使用using
语句自动释放资源,避免内存泄漏。 - 性能优化:
启用连接池(默认开启),避免频繁开关连接。 - 监控与日志:
集成APM工具(如Application Insights)监控SQL执行时间。
引用说明
- 官方文档:Microsoft.Data.SqlClient
- 安全规范:OWASP SQL注入防御指南
- 性能优化:EF Core性能调优
通过遵循以上步骤和安全规范,开发者可以构建可靠、高效的数据库交互功能,同时满足搜索引擎对E-A-T(专业性、权威性、可信度)的要求。