/// <summary>
/// 通过 SqlBulkCopy 实现高效批量插入(适用于 SQL Server,支持取消)
/// </summary>
/// <param name="insertTable">要插入的数据表(每行对应一条记录)</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>成功插入的行数</returns>
public async Task<int> BulkBaseInsertAsync(DataTable insertTable, CancellationToken cancellationToken = default)
{
if (insertTable.Rows.Count == 0)
return 0;
var tableName = insertTable.TableName;
// 1. 线程安全:同步表结构(只执行一次 DDL)
// await EnsureTableStructureAsync(insertTable, cancellationToken);
// 2. 创建数据库连接(连接字符串应从类成员或配置中获取)
using (var connection = _database.CreateConnection() as SqlConnection)
{
await connection.OpenAsync(cancellationToken);
// 3. 配置 SqlBulkCopy
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, null))
{
bulkCopy.DestinationTableName = tableName;
bulkCopy.BatchSize = insertTable.Rows.Count; // 也可根据数据量动态调整
bulkCopy.EnableStreaming = true; // 大数据集时提升性能
bulkCopy.BulkCopyTimeout = 0; // 0 表示无超时,或根据需求设置
// 4. 列映射(确保 DataTable 列与数据库表列匹配)
foreach (DataColumn col in insertTable.Columns)
{
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
// 5. 异步执行批量插入(支持 CancellationToken)
await bulkCopy.WriteToServerAsync(insertTable, cancellationToken);
}
}
// 6. 若执行成功,返回总行数
return insertTable.Rows.Count;
}