373 lines
19 KiB
C#
373 lines
19 KiB
C#
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<INTERNO_Versiones_Modelo> lst_Versiones_Ejecutadas = new List<INTERNO_Versiones_Modelo>();
|
|
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)
|
|
{ }
|
|
}
|
|
|
|
}
|
|
}
|