/// <summary> /// Carga una sentencia para exportar CSV /// </summary> private SentenceBase LoadSentenceExportCsv(MLNode rootML) { SentenceExportCsv sentence = new SentenceExportCsv(); // Asigna las propiedades sentence.Source = rootML.Attributes[TagSource].Value; sentence.FileName = rootML.Attributes[TagFileName].Value; sentence.BatchSize = rootML.Attributes[TagBatchSize].Value.GetInt(BatchSizeDefault); sentence.Command = GetProviderCommand(rootML, TagLoad); // Carga la definición LoadDefinitionCsv(sentence.Definition, rootML); // Devuelve la sentencia return(sentence); }
/// <summary> /// Crea una sentencia de exportación a CSV con los datos de la tabla /// </summary> private SentenceExportCsv CreateSentence(SentenceExportCsvSchema sentence, TableDbModel table) { SentenceExportCsv exportSentence = new SentenceExportCsv(); // Asigna las propiedades exportSentence.Source = sentence.Source; exportSentence.FileName = table.Name + ".csv"; exportSentence.Command = GetSelect(table); exportSentence.BatchSize = sentence.BatchSize; exportSentence.Timeout = sentence.Timeout; // Asigna los parámetros de archivo exportSentence.Definition = sentence.Definition; // Devuelve la sentencia de exportación return(exportSentence); }
/// <summary> /// Procesa una exportación de una consulta a CSV /// </summary> internal bool Execute(SentenceExportCsv sentence) { bool exported = false; string fileName = Processor.Manager.Step.Project.GetFullFileName(sentence.FileName); // Exporta los datos using (BlockLogModel block = Processor.Manager.Logger.Default.CreateBlock(LogModel.LogType.Info, $"Start exporting to '{fileName}'")) { if (string.IsNullOrWhiteSpace(sentence.Command.Sql)) { block.Error("There is not command at export sentence"); } else { ProviderModel provider = Processor.GetProvider(sentence.Source); if (provider == null) { block.Error($"Can't find the provider. Key: '{sentence.Source}'"); } else { CommandModel command = Processor.ConvertProviderCommand(sentence.Command, out string error); if (!string.IsNullOrWhiteSpace(error)) { block.Error($"Error when convert export command. {error}"); } else { try { // Exporta los datos Export(fileName, provider, command, sentence, block); // Indica que se ha exportado correctamente exported = true; } catch (Exception exception) { block.Error($"Error when export to '{fileName}'", exception); } } } } } // Devuelve el valor que indica si se ha exportado correctamente return(exported); }
/// <summary> /// Exporta los datos de un comando /// </summary> private void Export(string fileName, ProviderModel provider, CommandModel command, SentenceExportCsv sentence, BlockLogModel block) { using (IDataReader reader = provider.OpenReader(command, sentence.Timeout)) { long records = 0; // Escribe en el archivo using (CsvWriter writer = new CsvWriter(sentence.Definition)) { List <ColumnModel> columns = GetColumns(reader); // Crea el directorio del archivo LibHelper.Files.HelperFiles.MakePath(System.IO.Path.GetDirectoryName(fileName)); // Abre el archivo writer.Open(fileName); // Añade las cabeceras writer.WriteHeaders(GetHeaders(columns, sentence.Definition.TypedHeader)); // Graba las líneas while (reader.Read()) { // Graba los valores writer.WriteRow(GetValues(columns, reader)); // Lanza el evento de progreso if (++records % sentence.BatchSize == 0) { block.Progress($"Copying {records:#,##0}", records, 0); } } // Log block.Info($"Exported {records:#,##0} records"); } } }