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; } }