说明:
- SqlSugarCore版本:5.1.4.169
方式1 使用SqlSugar的Updateable
特点:
- 代码可读性好,易于维护
- 支持事务和异常处理
适用场景:
- 中小型数据量更新
优点:
- 代码简洁
- 易于调试
缺点:
- 性能相对较低
- 内存占用较大
public async Task<int> BatchUpdateColumnAsync(
string tableName,
string columnName,
List<KeyValuePair<int, object>> idValuePairs)
{
try
{
// 验证输入
if (string.IsNullOrEmpty(tableName) ||
string.IsNullOrEmpty(columnName) ||
!idValuePairs.Any())
{
return 0;
}
// 构建更新数据
var updateData = idValuePairs
.Select(x => new Dictionary<string, object>
{
{ "ID", x.Key },
{ columnName, x.Value }
})
.ToList();
// 执行批量更新
return await _sqlSugarClient.Updateable(updateData)
.AS(tableName)
.WhereColumns("ID")
.ExecuteCommandAsync();
}
catch (Exception ex)
{
// 处理异常
throw new Exception($"批量更新列 {columnName} 失败", ex);
}
}
方式2 使用CASE WHEN SQL
特点:
- 采用 CASE WHEN 语法
适用场景:
- 中等数据量更新
优点:
- 执行效率高
缺点:
- 可维护性较差
public async Task<int> BatchUpdateColumnAsync(
string tableName,
string columnName,
List<KeyValuePair<int, object>> idValuePairs)
{
// 构建SQL
var sql = $"UPDATE {tableName} SET {columnName} = CASE Id ";
foreach (var pair in idValuePairs)
{
sql += $"WHEN {pair.Key} THEN @value{pair.Key} ";
}
sql += $"END WHERE Id IN ({string.Join(",", idValuePairs.Select(p => p.Key))})";
// 构建参数
var parameters = idValuePairs
.Select(p => new SugarParameter($"@value{p.Key}", p.Value))
.ToArray();
// 执行更新
return await _sqlSugarClient.Ado.ExecuteCommandAsync(sql, parameters);
}
方式3 批量SQL语句
特点:
- 多条 UPDATE 语句拼接
- 每条记录独立更新
适用场景:
- 小批量数据更新
- 需要独立处理每条记录的场景
- 需要精确控制的场景
优点:
- 实现简单
- 易于理解
- 灵活性高
缺点:
- 性能一般
- 不适合大量数据
public async Task<int> BatchUpdateColumnAsync(
string tableName,
string columnName,
List<KeyValuePair<int, object>> updates)
{
var sqlList = updates.Select(x =>
$"UPDATE {tableName} SET {columnName} = @value{x.Key} WHERE Id = {x.Key};");
var sql = string.Join("\n", sqlList);
var parameters = updates
.Select(x => new SugarParameter($"@value{x.Key}", x.Value))
.ToArray();
return await _sqlSugarClient.Ado.ExecuteCommandAsync(sql, parameters);
}
方式4 Bulk Update(大批量数据更新,性能要求高的场景)
特点:
- 使用 DataTable 批量操作
- 高性能实现
适用场景:
- 大批量数据更新
- 性能要求高的场景
- 需要处理大量数据的场景
优点:
- 性能最优
- 内存效率高
- 适合大数据量
缺点:
- 需要额外的数据转换
public async Task<int> BatchUpdateColumnAsync(
string tableName,
string columnName,
List<KeyValuePair<int, object>> updates)
{
// 创建 DataTable
var dt = new System.Data.DataTable(tableName);
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add(columnName, typeof(object)); // 使用传入的列名
// 添加数据
foreach (var update in updates)
{
dt.Rows.Add(update.Key, update.Value);
}
// 批量更新
return await _sqlSugarClient.Fastest<System.Data.DataTable>().AS(tableName).BulkUpdateAsync(tableName, dt, new string[] { "ID" }, new string[] { columnName });
}
使用
// 使用示例
var updates = new List<KeyValuePair<int, object>>
{
new KeyValuePair<int, object>(1, 89.6), // (id, 更新值)
new KeyValuePair<int, object>(2, 999.7)
};
// 表名,列名,更新数据
await BatchUpdateColumnAsync("tb_import_data", "WaterLevel", updates);