コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
ファイル: MsSqlBatcher.cs プロジェクト: xiawei666/fireasy2
        /// <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);
            }
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        /// <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);
            }
        }
コード例 #9
0
        /// <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);
            }
        }
コード例 #10
0
        /// <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);
            }
        }
コード例 #11
0
        /// <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);
            }
        }