当前位置:首页 > 行业动态 > 正文

如何用C连接数据库并修改SQL数据?

C#可通过ADO.NET或Entity Framework连接数据库执行SQL修改操作,使用SqlConnection建立连接,SqlCommand对象执行UPDATE语句,通过参数化查询防范注入攻击,调用ExecuteNonQuery完成数据更新,最后关闭连接释放资源。

准备工作

1 环境要求

  • 开发工具:Visual Studio(推荐2022版或更高)
  • 数据库:SQL Server(2016及以上版本)
  • .NET版本:.NET 6+(支持跨平台)

2 引用必要库
在项目中添加System.Data.SqlClientMicrosoft.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
0