using System.Data; using System.Threading; using System.Threading.Tasks; using GB5Shared.Connection; using GB5Shared.DTO.Framework.Login; using Microsoft.Data.SqlClient; namespace AdminDAL.CustomCode.BulkInsert { public class BulkInsertService : IBulkInsertService { private readonly IApplicationConnection _appConnection; public BulkInsertService(IApplicationConnection appConnection) => _appConnection = appConnection; public async Task InsertAsync( string destinationTable, DataTable data, LoginDTO login, CancellationToken ct = default) { if (data.Rows.Count == 0) return; string connStr = await _appConnection.DBConnectionStringCached(login); await using var connection = new SqlConnection(connStr); await connection.OpenAsync(ct).ConfigureAwait(false); using var bulkCopy = new SqlBulkCopy(connection) { DestinationTableName = destinationTable, BatchSize = 5000, BulkCopyTimeout = 300 }; foreach (DataColumn col in data.Columns) bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); await bulkCopy.WriteToServerAsync(data, ct).ConfigureAwait(false); } } }