上一篇
如何用C连接数据库并修改SQL数据?
- 行业动态
- 2025-05-12
- 5
C#可通过ADO.NET或Entity Framework连接数据库执行SQL修改操作,使用SqlConnection建立连接,SqlCommand对象执行UPDATE语句,通过参数化查询防范注入攻击,调用ExecuteNonQuery完成数据更新,最后关闭连接释放资源。
准备工作
1 环境要求
- 开发工具:Visual Studio(推荐2022版或更高)
- 数据库:SQL Server(2016及以上版本)
- .NET版本:.NET 6+(支持跨平台)
2 引用必要库
在项目中添加System.Data.SqlClient
或Microsoft.Data.SqlClient
(推荐后者,支持最新功能):
using Microsoft.Data.SqlClient;
建立数据库连接
1 连接字符串配置
将连接字符串存储在appsettings.json
或通过环境变量管理,避免硬编码:
{ "ConnectionStrings": { "DefaultConnection": "Server=your_server; Database=your_db; User Id=your_user; Password=your_pwd; TrustServerCertificate=True;" } }
2 使用SqlConnection
对象
通过依赖注入或手动创建连接对象:
var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); string connectionString = configuration.GetConnectionString("DefaultConnection"); using (SqlConnection connection = new SqlConnection(connectionString)) { await connection.OpenAsync(); // 执行操作 }
执行修改操作(以UPDATE为例)
1 参数化查询(防SQL注入)
使用SqlCommand
和参数占位符:
string updateQuery = @" UPDATE Users SET Email = @NewEmail WHERE Id = @UserId"; using (SqlCommand command = new SqlCommand(updateQuery, connection)) { command.Parameters.AddWithValue("@NewEmail", "new@example.com"); command.Parameters.AddWithValue("@UserId", 123); int affectedRows = await command.ExecuteNonQueryAsync(); Console.WriteLine($"已更新 {affectedRows} 行"); }
2 事务处理(保证数据一致性)
using (SqlTransaction transaction = connection.BeginTransaction()) { try { using (SqlCommand command = connection.CreateCommand()) { command.Transaction = transaction; command.CommandText = updateQuery; // 添加参数... await command.ExecuteNonQueryAsync(); } transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); Console.WriteLine($"操作失败: {ex.Message}"); } }
完整示例代码
public async Task UpdateUserEmail(int userId, string newEmail) { try { using (SqlConnection connection = new SqlConnection(connectionString)) { await connection.OpenAsync(); string query = "UPDATE Users SET Email = @Email WHERE Id = @Id"; using (SqlCommand command = new SqlCommand(query, connection)) { command.Parameters.AddWithValue("@Email", newEmail); command.Parameters.AddWithValue("@Id", userId); int result = await command.ExecuteNonQueryAsync(); if (result > 0) { Console.WriteLine("更新成功"); } } } } catch (SqlException ex) { Console.WriteLine($"数据库错误: {ex.Number}"); } catch (Exception ex) { Console.WriteLine($"未知错误: {ex.Message}"); } }
注意事项与优化
1 安全性
- 禁止拼接SQL字符串:严格使用参数化查询。
- 最小权限原则:数据库账号仅授予必要权限(如仅允许
UPDATE
)。
2 性能优化
- 连接池:默认启用,避免频繁开闭连接。
- 异步操作:使用
async/await
提升并发能力。
3 错误处理
- 捕获特定异常(如
SqlException
)并记录日志。 - 使用
try-catch-finally
确保资源释放。
引用说明
- 微软官方文档:SqlCommand Class (Microsoft.Data.SqlClient)
- OWASP SQL注入防护指南:Parameterized Queries