/// <summary> /// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。 /// </summary> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public async Task InsertAsync(IDatabase database, DataTable dataTable, int batchSize = 1000, Action <int> completePercentage = null, CancellationToken cancellationToken = default) { if (!BatcherChecker.CheckDataTable(dataTable)) { return; } try { database.Connection.TryOpen(); //给表名加上界定符 var syntax = database.Provider.GetService <ISyntaxProvider>(); var tableName = syntax.FormatByDelimiter(dataTable.TableName); using var bulk = new SqlBulkCopy((SqlConnection)database.Connection, SqlBulkCopyOptions.KeepIdentity, (SqlTransaction)database.Transaction) { DestinationTableName = tableName, BatchSize = batchSize }; using var reader = new DataTableBatchReader(bulk, dataTable); await bulk.WriteToServerAsync(reader, cancellationToken); } catch (Exception exp) { throw new BatcherException(dataTable.Rows, exp); } }
/// <summary> /// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。 /// </summary> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public void Insert(IDatabase database, DataTable dataTable, int batchSize = 1000, Action <int> completePercentage = null) { if (!BatcherChecker.CheckDataTable(dataTable)) { return; } try { database.Connection.TryOpen(); //给表名加上前后导符 var tableName = DbUtility.FormatByQuote(database.Provider.GetService <ISyntaxProvider>(), dataTable.TableName); using (var bulk = new SqlBulkCopy((SqlConnection)database.Connection, SqlBulkCopyOptions.KeepIdentity, (SqlTransaction)database.Transaction) { DestinationTableName = tableName, BatchSize = batchSize }) using (var reader = new DataTableBatchReader(bulk, dataTable)) { bulk.WriteToServer(reader); } } catch (Exception exp) { throw new BatcherException(dataTable.Rows, exp); } }
/// <summary> /// 将一个 <see cref="IList"/> 批量插入到数据库中。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="list">要写入的数据列表。</param> /// <param name="tableName">要写入的数据表的名称。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public async Task InsertAsync <T>(IDatabase database, IEnumerable <T> list, string tableName, int batchSize = 1000, Action <int> completePercentage = null, CancellationToken cancellationToken = default) { if (!BatcherChecker.CheckList(list, tableName)) { return; } await BatchInsertAsync(database, ToCollection(list), tableName, null, (map, command, r, item) => MapListItem <T>(database.Provider, map, (T)item, r, command.Parameters), batchSize, completePercentage); }
/// <summary> /// 将一个 <see cref="IList"/> 批量插入到数据库中。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="list">要写入的数据列表。</param> /// <param name="tableName">要写入的数据表的名称。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public void Insert <T>(IDatabase database, IEnumerable <T> list, string tableName, int batchSize = 1000, Action <int> completePercentage = null) { if (!BatcherChecker.CheckList(list, tableName)) { return; } BatchInsert(database, ToCollection(list), tableName, null, (map, command, r, item) => MapListItem <T>(database.Provider, map, (T)item, r, command.Parameters), batchSize, completePercentage); }
/// <summary> /// 将一个 <see cref="IList"/> 批量插入到数据库中。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="list">要写入的数据列表。</param> /// <param name="tableName">要写入的数据表的名称。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public void Insert <T>(IDatabase database, IEnumerable <T> list, string tableName, int batchSize = 1000, Action <int> completePercentage = null) { if (!BatcherChecker.CheckList(list, tableName)) { return; } Insert(database, list.ToDataTable(tableName), batchSize); }
/// <summary> /// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。 /// </summary> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public async Task InsertAsync(IDatabase database, DataTable dataTable, int batchSize = 1000, Action<int> completePercentage = null, CancellationToken cancellationToken = default) { if (!BatcherChecker.CheckDataTable(dataTable)) { return; } var mapping = GetNameTypeMapping(dataTable); await BatchInsertAsync(database, dataTable.Rows, dataTable.TableName, mapping, (map, command, r, item) => MapDataRow(database.Provider, map, (DataRow)item, r, command.Parameters), batchSize, completePercentage); }
/// <summary> /// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。 /// </summary> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public void Insert(IDatabase database, DataTable dataTable, int batchSize = 1000, Action <int> completePercentage = null) { if (!BatcherChecker.CheckDataTable(dataTable)) { return; } var mapping = GetNameTypeMapping(dataTable); BatchInsert(database, dataTable.Rows, dataTable.TableName, mapping, (map, command, r, item) => MapDataRow(database.Provider, map, (DataRow)item, r, command.Parameters), batchSize, completePercentage); }
/// <summary> /// 将一个 <see cref="IList"/> 批量插入到数据库中。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="list">要写入的数据列表。</param> /// <param name="tableName">要写入的数据表的名称。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public void Insert <T>(IDatabase database, IEnumerable <T> list, string tableName, int batchSize = 1000, Action <int> completePercentage = null) { if (!BatcherChecker.CheckList(list, tableName)) { return; } var bulkType = CheckBulkCopy(database.Provider); if (bulkType != null) { BulkCopy(database, bulkType, list.ToDataTable(tableName), batchSize); } else { BatchInsert(database, ToCollection(list), tableName, null, batchSize, completePercentage); } }
/// <summary> /// 将一个 <see cref="IList"/> 批量插入到数据库中。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="list">要写入的数据列表。</param> /// <param name="tableName">要写入的数据表的名称。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public async Task InsertAsync <T>(IDatabase database, IEnumerable <T> list, string tableName, int batchSize = 1000, Action <int> completePercentage = null, CancellationToken cancellationToken = default) { if (!BatcherChecker.CheckList(list, tableName)) { return; } var bulkType = CheckBulkCopy(database.Provider); if (bulkType != null) { BulkCopy(database, bulkType, list.ToDataTable(tableName), batchSize); } else { await BatchInsertAsync(database, ToCollection(list), tableName, null, batchSize, completePercentage, cancellationToken); } }
/// <summary> /// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。 /// </summary> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public void Insert(IDatabase database, DataTable dataTable, int batchSize = 1000, Action <int> completePercentage = null) { if (!BatcherChecker.CheckDataTable(dataTable)) { return; } var bulkType = CheckBulkCopy(database.Provider); if (bulkType != null) { BulkCopy(database, bulkType, dataTable, batchSize); } else { var mapping = GetNameTypeMapping(dataTable); BatchInsert(database, dataTable.Rows, dataTable.TableName, mapping, batchSize, completePercentage); } }
/// <summary> /// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。 /// </summary> /// <param name="database">提供给当前插件的 <see cref="IDatabase"/> 对象。</param> /// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param> /// <param name="batchSize">每批次写入的数据量。</param> /// <param name="completePercentage">已完成百分比的通知方法。</param> public async Task InsertAsync(IDatabase database, DataTable dataTable, int batchSize = 1000, Action <int> completePercentage = null, CancellationToken cancellationToken = default) { if (!BatcherChecker.CheckDataTable(dataTable)) { return; } var bulkType = CheckBulkCopy(database.Provider); if (bulkType != null) { BulkCopy(database, bulkType, dataTable, batchSize); } else { var mapping = GetNameTypeMapping(dataTable); await BatchInsertAsync(database, dataTable.Rows, dataTable.TableName, mapping, batchSize, completePercentage, cancellationToken); } }