Exemplo n.º 1
0
        private int DoAllWork()
        {
            string        Sent_SQL;
            string        s, SQL_Origen = "select ";
            bool          reportprogress;
            SqlBulkCopy   BatchCopy;
            SqlDataReader Reader;
            bool          primero = true;

            Worker.ReportProgress(0, "Iniciando Proceso");
            SqlCommand CmdDest, CmdOrig;

            System.Data.SqlClient.SqlConnection con = new SqlConnection(DBDestino.ConnectionString);
            CmdDest = con.CreateCommand();
            CmdOrig = con.CreateCommand();

            CmdDest.Connection.Open();
            CmdOrig.Connection.Open();
            CmdDest.CommandTimeout = 0;
            CmdOrig.CommandTimeout = 0;


            if (RcrearTablaDestino.Checked)
            {//si se selecciona la opcion de crear tabla destino, hacer drop en la tabla si existe, y luego crear
                Worker.ReportProgress(0, "Creando Tabla Destino");
                #region Creacion de la Tabla Destino
                Sent_SQL = "if object_id('@tabla') is not null \n" +
                           "	drop table @tabla \n";

                Sent_SQL            = Sent_SQL.Replace("@tabla", TTablaDestino.Text);
                CmdDest.CommandText = Sent_SQL;
                CmdDest.ExecuteNonQuery();
                //crea un scrip para crear la tabla de la base de datos
                s = "create table " + TTablaDestino.Text + "\r\n";
                s = s + "(\r\n";
                //defino los campos que lleva
                int i, n;
                n             = ListaCamposOrigen2.Items.Count;
                CamposDestino = new List <Visor_sql_2015.Objetos.CParametro>();
                for (i = 0; i < n; i++)
                {
                    Objetos.CParametro obj = (Objetos.CParametro)ListaCamposOrigen2.Items[i];
                    CamposDestino.Add(obj);
                    //le asigno el nombre del campo
                    s = s + "\t";
                    if (i > 0)
                    {
                        s = s + ",";
                    }
                    s = s + obj.nombre;
                    //le asigno el tipo
                    s = s + " " + obj.tipo;
                    if (obj.tipo.ToLower().Trim() == "varchar" || obj.tipo.ToLower().Trim() == "char" || obj.tipo.ToLower().Trim() == "nvarchar")
                    {
                        s = s + "(" + obj.Logitud.ToString() + ")";
                    }
                    // aplico la configuracion regional
                    if (obj.collation != "")
                    {
                        s = s + " COLLATE " + obj.collation;
                    }
                    //verifico si es nulo o no es nulo
                    if (obj.NULOS.ToLower().Trim() == "n")
                    {
                        s = s + " not null";
                    }
                    //doy un salto de linea para el siguiente campo
                    s = s + "\r\n";
                }
                //ahora checo los constrains
                System.Collections.Generic.List <Objetos.CParametro> PrimaryKeys;
                PrimaryKeys = DBOrigen.DameLLavesPrimarias(TTablaOrigen.Text);
                CmdOrig.Connection.Open();
                n       = PrimaryKeys.Count;
                primero = true;
                if (n > 0)
                {
                    string spk = "\t,constraint PK_" + TTablaDestino.Text + " primary key(";
                    for (i = 0; i < n; i++)
                    {
                        bool encontrado          = false;
                        Objetos.CParametro objpk = PrimaryKeys[i];
                        //checo si esta en la lista de campos eleccionados
                        foreach (Objetos.CParametro objpk2 in ListaCamposOrigen2.Items)
                        {
                            if (objpk.nombre == objpk2.nombre)
                            {
                                encontrado = true;
                                break;
                            }
                        }
                        if (encontrado == true)
                        {
                            if (primero == false)
                            {
                                spk = spk + ",";
                            }
                            else
                            {
                                primero = false;
                            }
                            spk = spk + objpk.nombre;
                        }
                    }
                    s = s + spk + ")\r\n";
                }
                s = s + "\r\n)";
                try
                {
                    CmdDest.CommandText = s;
                    CmdDest.ExecuteNonQuery();
                }
                catch (System.Exception ex)
                {
                    //se genro un error al crear la tabla
                    #region Cerrar Conexiones, Verificando si es que estan abiertas...
                    if (CmdDest.Connection.State == ConnectionState.Open)
                    {
                        CmdDest.Connection.Close();
                    }
                    if (CmdOrig.Connection.State == ConnectionState.Open)
                    {
                        CmdOrig.Connection.Close();
                    }
                    #endregion
                    System.Windows.Forms.MessageBox.Show(ex.Message, "ERROR");
                    return(-1);
                }
                #endregion
                Worker.ReportProgress(0, "Tabla Destino Creada");
            }
            else
            {//si no existe borrar los registros en la tabla
                Worker.ReportProgress(0, "Borrando Informacion de la Tabla Destino");
                #region Borrado de registros de la tabla destino
                //Quitar las restricciones y triggers sobre la tabla antes de borrar
                CmdDest.CommandText  = "ALTER TABLE [dbo].[" + TTablaDestino.Text + "] NOCHECK CONSTRAINT ALL";
                CmdDest.CommandText += " ALTER TABLE [dbo].[" + TTablaDestino.Text + "] DISABLE TRIGGER ALL";
                CmdDest.ExecuteNonQuery();

                //Borrar todos los registros de la tabla
                try
                {//primero definir si tiene llaves foraneas o no, para usar delete o truncate
                    CmdDest.CommandText = "SELECT OBJECTPROPERTY ( object_id('" + TTablaDestino.Text + "'),'TableHasForeignRef')";
                    int intref = Convert.ToInt32(CmdDest.ExecuteScalar());
                    if (intref == 1)
                    {
                        CmdDest.CommandText = "DELETE FROM " + TTablaDestino.Text;
                    }
                    else
                    {
                        CmdDest.CommandText = "TRUNCATE TABLE " + TTablaDestino.Text;
                    }
                    CmdDest.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    #region Cerrar Conexiones, Verificando si es que estan abiertas...
                    if (CmdDest.Connection.State == ConnectionState.Open)
                    {
                        CmdDest.Connection.Close();
                    }
                    if (CmdOrig.Connection.State == ConnectionState.Open)
                    {
                        CmdOrig.Connection.Close();
                    }
                    #endregion
                    MessageBox.Show(ex.Message, "Error en el Borrado de la Tabla", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    DBDestino.Close();
                    return(-1);
                }
                //Reactivar las Restricciones y triggers
                CmdDest.CommandText  = "ALTER TABLE [dbo].[" + TTablaDestino.Text + "] CHECK CONSTRAINT ALL";
                CmdDest.CommandText += " ALTER TABLE [dbo].[" + TTablaDestino.Text + "] ENABLE TRIGGER ALL";
                CmdDest.ExecuteNonQuery();
                #endregion
                Worker.ReportProgress(0, "Tabla Destino \"Limpia\"");
            }

            try
            {
                #region obtener el numero de registros a mover
                if (TFiltro.Text.Length > 0)
                {
                    Sent_SQL = "select count(*) as records from " + TTablaOrigen.Text + " where " + TFiltro.Text;
                }
                else
                {
                    Sent_SQL = "select count(*) as records from " + TTablaOrigen.Text;
                }

                CmdOrig.CommandText = Sent_SQL;
                records             = Convert.ToInt32(CmdOrig.ExecuteScalar());
                Worker.ReportProgress(0, "Copiando Registros 0/" + records.ToString());

                //definir si el numero de registros merece actualizar la barra de progreso
                if (records > 5000)
                {
                    reportprogress = true;
                }
                else
                {
                    reportprogress = false;
                }
                #endregion

                #region Obtener los datos de origen y hacer el mapeo de Columna_Origen vs Columna_Destino
                //generar el select de los datos origen
                primero = true;
                foreach (Objetos.CParametro obj in ListaCamposOrigen2.Items)
                {
                    if (primero == false)
                    {
                        SQL_Origen += ", ";
                    }
                    else
                    {
                        primero = false;
                    }

                    if (obj.AutoIncremental == true)
                    {
                        Identidad = true;
                    }
                    SQL_Origen += obj.nombre;
                }
                SQL_Origen += " from " + TTablaOrigen.Text;
                if (TFiltro.Text.Trim() != "")
                {
                    //hay que agregar el filtro
                    SQL_Origen += " where " + TFiltro.Text;
                }
                CmdOrig.CommandText = SQL_Origen;
                Reader = CmdOrig.ExecuteReader();

                BatchCopy = new SqlBulkCopy(DBDestino.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.CheckConstraints);

                //Mapear/Relacionar columnas de origen con las columnas de destino
                for (int i = 0; i < ListaCamposOrigen2.Items.Count; i++)
                {
                    Objetos.CParametro Orig, Dest;
                    Orig = (Objetos.CParametro)ListaCamposOrigen2.Items[i];
                    if (!RcrearTablaDestino.Checked)
                    {
                        Dest = (Objetos.CParametro)ListaCamposDestino2.Items[i];
                    }
                    else
                    {
                        Dest = (Objetos.CParametro)ListaCamposOrigen2.Items[i];
                    }
                    BatchCopy.ColumnMappings.Add(Orig.nombre, Dest.nombre);
                }
                #endregion

                if (reportprogress)
                {
                    BatchCopy.NotifyAfter    = 5000;
                    BatchCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(BatchCopy_SqlRowsCopied);
                }

                BatchCopy.BulkCopyTimeout      = 0;
                BatchCopy.DestinationTableName = TTablaDestino.Text;
                BatchCopy.WriteToServer(Reader);
                BatchCopy.Close();
                Reader.Close();


                #region Cerrar Conexiones, Verificando si es que estan abiertas...
                if (CmdDest.Connection.State == ConnectionState.Open)
                {
                    CmdDest.Connection.Close();
                }
                if (CmdOrig.Connection.State == ConnectionState.Open)
                {
                    CmdOrig.Connection.Close();
                }
                #endregion
                return(1);
            }
            catch (Exception ex)
            {
                #region Cerrar Conexiones, Verificando si es que estan abiertas...
                if (CmdDest.Connection.State == ConnectionState.Open)
                {
                    CmdDest.Connection.Close();
                }
                if (CmdOrig.Connection.State == ConnectionState.Open)
                {
                    CmdOrig.Connection.Close();
                }
                #endregion
                throw ex;
//                return -1;
            }
        }