using Exferia_Actualizacion_BD._1_Datos; using Exferia_Actualizacion_BD._3_Vistas; using Exferia_Actualizacion_BD.General; using Exferia_Aplicacion.General; using Exferia_Aplicacion.Modelos_Generales; using Exferia_EntityFramework; using Exferia_EntityFramework.Script_Actualizacion; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Transactions; using System.Windows.Forms; namespace Exferia_Actualizacion_BD { public class Datos_Actualizacion_BD { #region Variables privadas private BackgroundWorker g_obj_TareaAsincrona_EjecutarScripts =null; private int g_int_Terminado_Correctamente = 0; private bool g_bol_Termino = false; private PE_Proceso_Actualizacion g_frm_PE_Proceso_Actualizacion = new PE_Proceso_Actualizacion(); private string g_str_Ruta_Aplicacion = ""; private string g_str_Nombre_ExferiaEntityFramework = ""; #endregion public int Comprobar_Actualizaciones_BD(string _str_Ruta_Aplicacion,string _str_Nombre_ExferiaEntityFramework) { g_int_Terminado_Correctamente = 0; g_str_Ruta_Aplicacion = _str_Ruta_Aplicacion; g_str_Nombre_ExferiaEntityFramework = _str_Nombre_ExferiaEntityFramework; try { //Mostrar pantalla de progreso g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Progreso = 0; g_frm_PE_Proceso_Actualizacion.PE_Proceso_Total = 0; g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Titulo = "Comprobando conexión a base de datos ..."; g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_InformacionProgreso = 0; g_frm_PE_Proceso_Actualizacion.Visible = true; if (g_obj_TareaAsincrona_EjecutarScripts != null) { while (g_obj_TareaAsincrona_EjecutarScripts.IsBusy) Application.DoEvents(); } else { g_obj_TareaAsincrona_EjecutarScripts = new BackgroundWorker(); g_obj_TareaAsincrona_EjecutarScripts.DoWork += new DoWorkEventHandler(TareaAsincrona_EjecutarScripts_DoWork); g_obj_TareaAsincrona_EjecutarScripts.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_EjecutarScripts_ProgressChanged); g_obj_TareaAsincrona_EjecutarScripts.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_EjecutarScripts_Completed); g_obj_TareaAsincrona_EjecutarScripts.WorkerReportsProgress = true; } g_bol_Termino = false; //Ejecutar TareaAsincrona g_obj_TareaAsincrona_EjecutarScripts.RunWorkerAsync(); //Te quedas esperando a que termine la tarea asincrona de Ejecutar Script if (g_obj_TareaAsincrona_EjecutarScripts != null) { while (g_bol_Termino == false) { Application.DoEvents(); Thread.Sleep(10); } } } catch (Control_Errores ) { g_bol_Termino = false; g_frm_PE_Proceso_Actualizacion.Visible = false; Mensajes.MostrarMensaje(Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS); g_int_Terminado_Correctamente = -1; } catch (Exception ex) { g_bol_Termino = false; g_frm_PE_Proceso_Actualizacion.Visible = false; Mensajes.MostrarMensaje(Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS); Control_Errores.Errores_Log("", ex, nameof(Datos_Actualizacion_BD) + "/" + nameof(Comprobar_Actualizaciones_BD)); g_int_Terminado_Correctamente = -1; } return g_int_Terminado_Correctamente; } private void TareaAsincrona_EjecutarScripts_DoWork(object sender, DoWorkEventArgs e) { INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo(); mdl_ValorDevuelto_Modelo.TodoCorrecto = true; mdl_ValorDevuelto_Modelo.Mensaje = ""; try { PRV_Actualizaciones_Datos obj_PRV_Actualizaciones_Datos = new PRV_Actualizaciones_Datos(); //Version del Exferia_EntityFramework instalada en la aplicacion FileVersionInfo obj_FileVersion_Exferia_EntityFramework = FileVersionInfo.GetVersionInfo(g_str_Ruta_Aplicacion + @"\" + g_str_Nombre_ExferiaEntityFramework); Version obj_Version_Exferia_EntityFramework = Version.Parse(obj_FileVersion_Exferia_EntityFramework.ProductVersion); //Parsenado la base de datos (es solo la primera conuslta a base de datos) ((BackgroundWorker)sender).ReportProgress(0, "2"); //Buscar el Base de datos la ultima version actualizada PRV_Actualizaciones mdl_PRV_Actualizaciones = obj_PRV_Actualizaciones_Datos.Obtener_UltimaActualizacion(); //Buscar fichero de script de actualizaciones ejecutados List lst_Versiones_Ejecutadas = new List(); StreamReader obj_StreamReader_FICHERO = null; try { if (File.Exists(g_str_Ruta_Aplicacion + @"\" + Variables.G_STR_NOMBREFICHERO_ACTUALIZACIONESREALIZADAS)) { //Recorrer todas las lineas , para ver que script se han ejecutado int int_Contador = 0; string str_Linea; obj_StreamReader_FICHERO = new StreamReader(g_str_Ruta_Aplicacion + @"\" + Variables.G_STR_NOMBREFICHERO_ACTUALIZACIONESREALIZADAS); while ((str_Linea = obj_StreamReader_FICHERO.ReadLine()) != null) { if (str_Linea.Trim().Length > 0) { string[] arr_Datos = str_Linea.Split('|'); lst_Versiones_Ejecutadas.Add(new INTERNO_Versiones_Modelo("", new Version(arr_Datos[0]), DateTime.ParseExact(arr_Datos[1], "dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture))); } //Aumentaro Contador int_Contador++; } //Cerrar Fichero obj_StreamReader_FICHERO.Close(); obj_StreamReader_FICHERO.Dispose(); } } catch (Exception ex) { if (obj_StreamReader_FICHERO == null) { obj_StreamReader_FICHERO.Close(); } Control_Errores.Errores_Log("", ex, nameof(Datos_Actualizacion_BD) + "/" + nameof(Comprobar_Actualizaciones_BD)); g_int_Terminado_Correctamente = -1; } //Si no dio ningun Error Comprobamos si hay que ejecutar scripts if (g_int_Terminado_Correctamente == 0) { bool bol_Ejecutar_Script = false; //Si no tiene fichero de actualizciones generadas se ejecuta if (lst_Versiones_Ejecutadas.Count == 0) { bol_Ejecutar_Script = true; } //Si la Version grabada en BD esta a nula, se genera else if (mdl_PRV_Actualizaciones == null) { bol_Ejecutar_Script = true; } //Si la ultima version que tengo ejecutada de scrip, no es la ultima version disponible se Ejecuta else if (lst_Versiones_Ejecutadas.OrderByDescending(m => m.version).FirstOrDefault().version < new Version(mdl_PRV_Actualizaciones.versionETF_Numero_Texto)) { bol_Ejecutar_Script = true; } //Si la Version que hay es menor que la que esta en Base de datos, aviso de Problema de compatibilidad else if (obj_Version_Exferia_EntityFramework < new Version(mdl_PRV_Actualizaciones.versionETF_Numero_Texto)) { g_int_Terminado_Correctamente = 1; } //Si la Version que hay es mayor que la que esta en Base de datos,se ejecuta else if (obj_Version_Exferia_EntityFramework > new Version(mdl_PRV_Actualizaciones.versionETF_Numero_Texto)) { bol_Ejecutar_Script = true; } //Se ejecuta para que genere los scripts if (bol_Ejecutar_Script) { //Leer todos los Scripts de Actualizaciones Superiores a la ultima version que se ejecuto long lng_VersionUltimo_Script_Ejecutado = 0; if (lst_Versiones_Ejecutadas.Count > 0) { lng_VersionUltimo_Script_Ejecutado = long.Parse(lst_Versiones_Ejecutadas.OrderByDescending(m => m.version).FirstOrDefault().version.ToString().Replace(".", "")); } Versiones_EF obj_Versiones_EF = new Versiones_EF(); if (obj_Versiones_EF.G_LST_VERSIONES_EF!=null && obj_Versiones_EF.G_LST_VERSIONES_EF.Count>0) { List< INTERNO_Versiones_EF_Modelo > lst_INTERNO_Versiones_EF_Modelo = obj_Versiones_EF.G_LST_VERSIONES_EF.OrderBy(m => m.Version_Numerica).Where(x => x.Version_Numerica > lng_VersionUltimo_Script_Ejecutado).ToList(); if (lst_INTERNO_Versiones_EF_Modelo!=null && lst_INTERNO_Versiones_EF_Modelo.Count > 0) { //Actualizar Pantalla de Progreso ((BackgroundWorker)sender).ReportProgress(lst_INTERNO_Versiones_EF_Modelo.Count,"0"); try { PRV_Actualizaciones mdl_PRV_Actualizaciones_GRABAR = null; DateTime dtt_FechaHora_Actual = DateTime.Now; int int_Contador = 0; foreach (INTERNO_Versiones_EF_Modelo mdl_INTERNO_Versiones_EF_Modelo in lst_INTERNO_Versiones_EF_Modelo.OrderBy(m=>m.Version_Numerica)) { //Ejecutar los Script Procedimientpo if (mdl_INTERNO_Versiones_EF_Modelo.Tipo==1) { obj_PRV_Actualizaciones_Datos.Ejecutar_Script_Procedimientos(mdl_INTERNO_Versiones_EF_Modelo.Script); } //Ejecutar los Script else { obj_PRV_Actualizaciones_Datos.Ejecutar_Script(mdl_INTERNO_Versiones_EF_Modelo.Script); } //Grabar registro en BD mdl_PRV_Actualizaciones_GRABAR = new PRV_Actualizaciones(); mdl_PRV_Actualizaciones_GRABAR.versionEFT_Numero_Numerica = mdl_INTERNO_Versiones_EF_Modelo.Version_Numerica; mdl_PRV_Actualizaciones_GRABAR.versionETF_Numero_Texto = mdl_INTERNO_Versiones_EF_Modelo.Version.ToString(); mdl_PRV_Actualizaciones_GRABAR.fechaEjecucion = dtt_FechaHora_Actual; obj_PRV_Actualizaciones_Datos.Insertar(mdl_PRV_Actualizaciones_GRABAR); //Actualizar Pantalla de Progreso int_Contador += 1; ((BackgroundWorker)sender).ReportProgress(int_Contador,"1"); } string str_TextoFichero = ""; //Grabar en el fichero todos los scripts ejecutados foreach (INTERNO_Versiones_EF_Modelo mdl_INTERNO_Versiones_EF_Modelo in lst_INTERNO_Versiones_EF_Modelo) { str_TextoFichero += mdl_INTERNO_Versiones_EF_Modelo.Version.ToString() + "|" + dtt_FechaHora_Actual.ToString("dd/MM/yyyy HH:mm") + System.Environment.NewLine; } File.AppendAllText(g_str_Ruta_Aplicacion + @"\" + Variables.G_STR_NOMBREFICHERO_ACTUALIZACIONESREALIZADAS, str_TextoFichero); } catch (Control_Errores) { mdl_ValorDevuelto_Modelo.TodoCorrecto = false; mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS; } catch (Exception ex) { Control_Errores.Errores_Log("", ex, nameof(Datos_Actualizacion_BD) + "/" + nameof(TareaAsincrona_EjecutarScripts_DoWork)); mdl_ValorDevuelto_Modelo.TodoCorrecto = false; mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS; } } } } } } catch (ThreadAbortException ex) { Thread.ResetAbort(); Control_Errores.Errores_Log(ex.Message, ex, nameof(Datos_Actualizacion_BD) + "/" + nameof(TareaAsincrona_EjecutarScripts_DoWork)); mdl_ValorDevuelto_Modelo.TodoCorrecto = false; mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS; } catch (Control_Errores) { mdl_ValorDevuelto_Modelo.TodoCorrecto = false; mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS; } catch (Exception ex) { Control_Errores.Errores_Log(ex.Message, ex, nameof(Datos_Actualizacion_BD) + "/" + nameof(TareaAsincrona_EjecutarScripts_DoWork)); mdl_ValorDevuelto_Modelo.TodoCorrecto = false; mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS; } finally { e.Result = mdl_ValorDevuelto_Modelo; } } private void TareaAsincrona_EjecutarScripts_ProgressChanged(object sender, ProgressChangedEventArgs e) { try { if (e.UserState.ToString().Equals("0")) { //Vaciar progress ................................................................................................................. g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Progreso = 0; g_frm_PE_Proceso_Actualizacion.PE_Proceso_Total = e.ProgressPercentage; g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Titulo = "Actualizando la base de datos, por favor espere ..."; g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_InformacionProgreso = 0; g_frm_PE_Proceso_Actualizacion.Cambiar_Imagen(Imagenes.G_IMG_ESPERA); //................................................................................................................................. } else if (e.UserState.ToString().Equals("1")) { g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Progreso = e.ProgressPercentage; g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_InformacionProgreso = e.ProgressPercentage; } else if (e.UserState.ToString().Equals("2")) { //Vaciar progress ................................................................................................................. g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Progreso = 0; g_frm_PE_Proceso_Actualizacion.PE_Proceso_Total = e.ProgressPercentage; g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Titulo = "Montando la base de datos, esto puede tardar unos segundos, por favor espere ..."; g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_InformacionProgreso = 0; g_frm_PE_Proceso_Actualizacion.Cambiar_Imagen(Imagenes.G_IMG_MONTANDOBASEDATOS); //................................................................................................................................. } } catch (Exception) {} } private void TareaAsincrona_EjecutarScripts_Completed(object sender, RunWorkerCompletedEventArgs e) { g_frm_PE_Proceso_Actualizacion.Visible = false; g_bol_Termino = true; try { INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result; //Mostrar si tuviera algun mensaje if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false) { g_int_Terminado_Correctamente = -1; if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0) { Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje); } } else { if (g_int_Terminado_Correctamente == 1) { Mensajes.MostrarMensaje(Mensajes.G_STR_VALIDACION_ACTUALIZACION_BASEDATOS_VERSIONLOCAL_INFERIOR); } } } catch (Exception) { } } } }