示例#1
0
        public static async Task FastInsertAsync(this IDbConnection connection,
                                                 IEnumerable <object> list,
                                                 Type entityType,
                                                 Action <FastInsertConfig>?conf = null)
        {
            EnsureMySqlConnection(connection);

            var config = GetConfig(conf, entityType);

            if (!ConnectionStringValidator.ConnectionStringValid(connection.ConnectionString, out var error))
            {
                throw new ArgumentException(error);
            }

            var tableName = config.TableNameResolver.GetTableName();

            var writer   = CsvWriterConfigurator.GetWriter(entityType, config.BinaryFormat);
            var tableDef = TypeInfoProvider.GetClassFields(entityType, config.BinaryFormat).ToList();

            foreach (var partition in EnumerableExtensions.GetPartitions(list, config.BatchSize))
            {
                var fileName = $"{Guid.NewGuid()}.csv";

                try
                {
                    var csvSettings = new CsvFileSettings
                                      (
                        delimiter: ";;",
                        lineEnding: Environment.NewLine,
                        path: fileName,
                        fieldEscapedByChar: "\\\\",
                        fieldEnclosedByChar: ""
                                      );

                    var query = BuildLoadDataQuery.BuildQuery(tableName, tableDef, csvSettings);

                    await writer.WriteAsync(partition, csvSettings);

                    await connection.ExecuteAsync(query);
                }
                finally
                {
                    if (config?.Writer != null)
                    {
                        await config.Writer.WriteLineAsync(fileName + ":");

                        await config.Writer.WriteLineAsync(File.ReadAllText(fileName));
                    }

                    File.Delete(fileName);
                }
            }
        }