/// <summary> /// Importa los datos del archivo sobre el proveedor /// </summary> private void Import(ProviderModel provider, SentenceImportCsv sentence, string fileName, BlockLogModel block) { long records = 0; // Copia del origen al destino using (CsvReader reader = new CsvReader(fileName, sentence.Definition, sentence.Columns, sentence.BatchSize)) { // Asigna el manejador de eventos reader.ReadBlock += (sender, args) => block.Progress("Importing", args.Records, 0); // Copia los datos del archivo sobre la tabla records = provider.BulkCopy(reader, sentence.Table, sentence.Mappings, sentence.BatchSize, sentence.Timeout); } // Log block.Info($"Imported {records:#,##0} records"); }
/// <summary> /// Crea una sentencia de importación de una tabla con los datos de un archivo /// </summary> private SentenceImportCsv CreateSentence(SentenceImportCsvSchema sentence, TableDbModel table) { SentenceImportCsv importSentence = new SentenceImportCsv(); // Asigna las propiedades importSentence.Target = sentence.Target; importSentence.FileName = table.Name + ".csv"; importSentence.Table = table.Name; importSentence.BatchSize = sentence.BatchSize; importSentence.Timeout = sentence.Timeout; // Asigna los parámetros de archivo importSentence.Definition = sentence.Definition; // Devuelve la sentencia de importación return(importSentence); }
/// <summary> /// Carga una sentencia para importar CSV /// </summary> private SentenceBase LoadSentenceImportCsv(MLNode rootML) { SentenceImportCsv sentence = new SentenceImportCsv(); // Asigna las propiedades sentence.Target = rootML.Attributes[TagTarget].Value; sentence.FileName = rootML.Attributes[TagFileName].Value; sentence.Table = rootML.Attributes[TagTable].Value; sentence.BatchSize = rootML.Attributes[TagBatchSize].Value.GetInt(BatchSizeDefault); sentence.Timeout = GetTimeout(rootML, TimeSpan.FromHours(2)); // Carga la definición LoadDefinitionCsv(sentence.Definition, rootML); // Carga los mapeos LoadMappings(sentence.Mappings, rootML); sentence.Columns.AddRange(LoadColumnsCsv(rootML)); // Devuelve la sentencia return(sentence); }
/// <summary> /// Procesa una importación de un archivo /// </summary> internal bool Execute(SentenceImportCsv sentence) { bool imported = false; // Recoge los datos necesarios e importa el archivo using (BlockLogModel block = Processor.Manager.Logger.Default.CreateBlock(LogModel.LogType.Info, $"Start import CSV {sentence.FileName}")) { ProviderModel provider = Processor.GetProvider(sentence.Target); // Ejecuta el comando if (provider == null) { block.Error($"Can't find the provider. Key: '{sentence.Target}'"); } else { string fileName = Processor.Manager.Step.Project.GetFullFileName(sentence.FileName); if (!System.IO.File.Exists(fileName)) { block.Error($"Cant find the file '{fileName}'"); } else { try { // Importa el archivo Import(provider, sentence, fileName, block); // Indica que se ha ejecutado correctamente imported = true; } catch (Exception exception) { block.Error($"Error when import CSV '{fileName}'", exception); } } } } // Devuelve el valor que indica si se ha importado return(imported); }