Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/04/2007, 15:33
loquillo7
 
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 20 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