/// <summary>
        ///		Ejecuta el script
        /// </summary>
        internal async Task ExecuteScriptAsync(ConnectionModel connection, Application.Connections.Models.ArgumentListModel arguments,
                                               System.Threading.CancellationToken cancellationToken)
        {
            if (string.IsNullOrWhiteSpace(Content))
            {
                SolutionViewModel.MainViewModel.MainController.HostController.SystemController.ShowMessage("Introduzca una consulta para ejecutar");
            }
            else if (connection == null)
            {
                SolutionViewModel.MainViewModel.MainController.HostController.SystemController.ShowMessage("Seleccione una conexión");
            }
            else
            {
                using (LibLogger.Models.Log.BlockLogModel block = SolutionViewModel.MainViewModel.Manager.Logger.Default.CreateBlock(LibLogger.Models.Log.LogModel.LogType.Info,
                                                                                                                                     $"Comienza la ejecución de la consulta"))
                {
                    string selectedText = GetEditorSelectedText();

                    // Ejecuta la consulta
                    if (!string.IsNullOrEmpty(selectedText))
                    {
                        await SolutionViewModel.MainViewModel.Manager.ExecuteQueryAsync(connection, selectedText, arguments,
                                                                                        connection.TimeoutExecuteScript, cancellationToken);
                    }
                    else
                    {
                        await SolutionViewModel.MainViewModel.Manager.ExecuteQueryAsync(connection, Content, arguments,
                                                                                        connection.TimeoutExecuteScript, cancellationToken);
                    }
                    // Muestra el tiempo de ejecución
                    block.Info($"Tiempo de ejecución: {SolutionViewModel.ConnectionExecutionViewModel.ExecutionTime}");
                }
            }
        }
        /// <summary>
        ///		Obtiene los parámetros de un archivo
        /// </summary>
        internal (Application.Connections.Models.ArgumentListModel arguments, string error) GetParameters()
        {
            Application.Connections.Models.ArgumentListModel arguments = new Application.Connections.Models.ArgumentListModel();
            string error = string.Empty;

            // Carga los parámetros si es necesario
            if (!string.IsNullOrWhiteSpace(FileNameParameters))
            {
                if (!System.IO.File.Exists(FileNameParameters))
                {
                    error = "No se encuentra el archivo de parámetros";
                }
                else
                {
                    try
                    {
                        System.Data.DataTable table = new LibJsonConversor.JsonToDataTableConversor().ConvertToDataTable(LibHelper.Files.HelperFiles.LoadTextFile(FileNameParameters));

                        // Crea la colección de parámetros a partir de la tabla
                        if (table.Rows.Count == 0)
                        {
                            error = "No se ha encontrado ningún parámetro en el archivo";
                        }
                        else
                        {
                            foreach (System.Data.DataColumn column in table.Columns)
                            {
                                if (column.ColumnName.StartsWith("Constant.", StringComparison.CurrentCultureIgnoreCase))
                                {
                                    arguments.Constants.Add(column.ColumnName.Substring("Constant.".Length), table.Rows[0][column.Ordinal]);
                                }
                                else
                                {
                                    arguments.Parameters.Add(column.ColumnName, table.Rows[0][column.Ordinal]);
                                }
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        error = $"Error cuando se cargaba el archivo de parámetros. {exception.Message}";
                    }
                }
            }
            // Devuelve el resultado
            return(arguments, error);
        }
        /// <summary>
        ///		Ejecuta un archivo
        /// </summary>
        private async Task <bool> ExecuteFileAsync(BlockLogModel block, ExecuteFilesItemViewModel file, ConnectionModel connection,
                                                   Application.Connections.Models.ArgumentListModel arguments, System.Threading.CancellationToken cancellationToken)
        {
            bool executed = false;

            System.Timers.Timer timer = new System.Timers.Timer(TimeSpan.FromMilliseconds(500).TotalMilliseconds);

            // Asigna el manejador de eventos al temporizador
            timer.Elapsed += (sender, args) => file.SetStatus(ExecuteFilesItemViewModel.Status.Start, "Ejecutando ...");
            timer.Start();
            // Ejecuta el archivo
            try
            {
                string content = LibHelper.Files.HelperFiles.LoadTextFile(System.IO.Path.Combine(file.Path, file.FileName));

                // Ejecuta el contenido del archivo
                if (string.IsNullOrWhiteSpace(content))
                {
                    file.SetStatus(ExecuteFilesItemViewModel.Status.Error, "El archivo está vacío");
                }
                else
                {
                    // Arranca la ejecución
                    file.SetStatus(ExecuteFilesItemViewModel.Status.Start, "Ejecutando ...");
                    // Ejecuta la consulta
                    await SolutionViewModel.MainViewModel.Manager.ExecuteQueryAsync(connection, content, arguments,
                                                                                    connection.TimeoutExecuteScript, cancellationToken);

                    // Detiene la ejecución
                    file.SetStatus(ExecuteFilesItemViewModel.Status.End, "Fin de ejecución");
                }
                // Indica que se ha ejecutado correctamente
                executed = true;
            }
            catch (Exception exception)
            {
                block.Error($"Error al ejecutar el archivo '{file.FileName}'");
                block.Error(exception.Message);
                file.SetStatus(ExecuteFilesItemViewModel.Status.Error, $"Error al ejecutar el archivo. {exception.Message}");
            }
            // Detiene el reloj
            timer.Stop();
            timer.Dispose();
            // Devuelve el valor que indica si se ha ejecutado correctamente
            return(!executed);
        }
        /// <summary>
        ///		Ejecuta el script
        /// </summary>
        internal async Task ExecuteScriptAsync(ConnectionModel connection, Application.Connections.Models.ArgumentListModel arguments, System.Threading.CancellationToken cancellationToken)
        {
            // Marca el estado de los scripts
            InitFileStatus();
            // Ejecuta los archivos
            if (CountEnqueuedFiles() == 0)
            {
                SolutionViewModel.MainViewModel.MainController.HostController.SystemController.ShowMessage("Seleccione al menos un archivo");
            }
            else if (connection == null)
            {
                SolutionViewModel.MainViewModel.MainController.HostController.SystemController.ShowMessage("Seleccione una conexión");
            }
            else
            {
                using (BlockLogModel block = SolutionViewModel.MainViewModel.Manager.Logger.Default.CreateBlock(LogModel.LogType.Info,
                                                                                                                "Comienza la ejecución de los archivos"))
                {
                    System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
                    bool hasError = false;

                    // Arranca el temporizador
                    stopwatch.Start();
                    // Ejecuta los archivos
                    foreach (ExecuteFilesItemViewModel file in Files)
                    {
                        if (file.State == ExecuteFilesItemViewModel.Status.Enqueued)
                        {
                            if (hasError)
                            {
                                file.SetStatus(ExecuteFilesItemViewModel.Status.Canceled, "Cancelado por un error anterior");
                            }
                            else
                            {
                                hasError = await ExecuteFileAsync(block, file, connection, arguments, cancellationToken);
                            }
                        }
                    }
                    // Muestra el tiempo de ejecución
                    stopwatch.Stop();
                    block.Info($"Tiempo de ejecución: {stopwatch.Elapsed.ToString()}");
                    SolutionViewModel.MainViewModel.Manager.Logger.Flush();
                }
            }
        }