Foros del Web » Programación para mayores de 30 ;) » .NET »

copiar data de bd con el comando SqlBulkCopy

Estas en el tema de copiar data de bd con el comando SqlBulkCopy en el foro de .NET en Foros del Web. tengo un problema de migracion de una bd utilizo un metodo para copiar las tablas y cada 10000 registro copia en 20 segundos, pero los ...
  #1 (permalink)  
Antiguo 18/04/2007, 15:33
 
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 1
copiar data de bd con el comando SqlBulkCopy

tengo un problema de migracion de una bd utilizo un metodo para copiar las tablas y cada 10000 registro copia en 20 segundos, pero los proximos 10000 los copia en 40 segundos , 1 min luego en 4 min y asi sucesivamnete todo el proceso demora casi una hora. Yo utilizo el comando
SqlBulkCopy.


Este es mi metodo de copiar tablas:


public bool CopyTable(DataTable dtInfo, int iTipoConexionO, int iTipoConexionD)
{
DataTable dtTables = new DataTable();
CC_Conexion cn = new CC_Conexion();
int x = 0, iMax, iRecords;
string sTName = dtInfo.TableName;
iMax= cn.GetBatch();
try
{
Application.DoEvents();
switch (dtInfo.ExtendedProperties["Estado"].ToString())
{
case "0":
case "1":
lblEstado.Text = "Copiando Tabla: " + sTName;
iRecords = cn.ExecuteScalar(string.Format("SELECT COUNT(1) FROM [{0}]", sTName), iTipoConexionO);
oLog.WriteLog("Registros de la tabla " + sTName + " : " + iRecords);
while (x <= iRecords)
{

oLog.WriteLog("Obteniendo los registros " + x + " - " + Convert.ToString((x + iMax<=iRecords)?(x+iMax): iRecords) + " de la tabla " + sTName);
dtTables = cn.ExecuteSelect(string.Format("SELECT * FROM [{0}]", sTName), sTName, iTipoConexionO, x, iMax).Tables[sTName];
using (SqlBulkCopy copy = new SqlBulkCopy(cn.GetCadenaDeConexion(iTipoConexionD) ))
{
foreach (DataRow drResult in dtInfo.Rows)
{
string sCName, sValor;
int iLength;
sCName = Convert.ToString(drResult["CName"]).Trim();
iLength = Convert.ToInt32(drResult["Length"]);
sValor = Convert.ToString(drResult["Valor"]).Trim();
switch (drResult["Estado"].ToString())
{
case ("0"):
copy.ColumnMappings.Add(sCName, sCName);
break;
case ("1"):
oLog.WriteLog("Agregando la columna " + sCName + " con el valor por defecto " + sValor);
switch (Convert.ToString(drResult["TName"]).Trim())
{
case "char":
dtTables.Columns.Add(sCName, System.Type.GetType("System.String"), "'" + sValor + "'");
break;
case "int":
dtTables.Columns.Add(sCName, System.Type.GetType("System.Int32"), sValor);
break;
}
copy.ColumnMappings.Add(sCName, sCName);
break;
case ("2"):
dtTables.Columns.Add(sCName + "Temp", System.Type.GetType("System.String"), "SUBSTRING(" + sCName + ", 1, " + iLength + " )");
copy.ColumnMappings.Add(sCName + "Temp", sCName);
break;
}
}
oLog.WriteLog("Comenzando copia");
copy.BulkCopyTimeout = cn.GetTimeout();
copy.DestinationTableName = sTName;
copy.WriteToServer(dtTables);
oLog.WriteLog("Copia realizada");
Application.DoEvents();
x += iMax;
}
}
oLog.WriteLog("La tabla: " + sTName + " fue copiada satisfactoriamente.");
break;
}
return true;
}
catch (Exception e)
{
lblEstado.Text = "";
MessageBox.Show("Error copiando la tabla: " + sTName, "Error", MessageBoxButtons.OK);
oLog.WriteLog("Error copiando la tabla " + sTName + ": " + e.Message);
throw e;
}
finally
{
dtTables.Dispose();
dtTables = null;
GC.Collect();
}
}




//Gracias por las ayudas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:39.