bom dia leitores,
Semana passada eu tive a necessidade de fazer uma programa que pegasse dados de aproximadamente 5000 txts e jogasse as informações no Sql Server. Cada txt é referente a uma tabela no banco, os arquivos juntos chegam a 50 gigas. Antes de me passarem a tarefa, o processamento que estavam fazendo era de insert normal e isso demorava duas semanas para completar todo o processamento.
Foi quando sugerir que fizessemos a importação via .net usando o objeto SqlBulkCopy. Esse objeto pega um datatable e insere “abruptamente” no SqlServer pois não grava nenhum log durante esse processo. Abaixo segue parte do codigo que usei para fazer essa importação que demorou 3 horas e 12 minutos, um tempo bastante viável levando em consideração a quantidade de dados.
Abaixo está o método main que cria duas threads, uma para o processamento e outra para a visualização do status do processamento.
static void Main(string[] args)
{
long tamanhoDiretorio = ObterTamanhoDoDiretorio(“E:\\basetxt\\”);
AtualizarStatus(0, tamanhoDiretorio, 0, tamanhoDiretorio, “”);
EscreveLog(DateTime.Now + “: Obtendo Lista de Tabelas”);
List<Tabela> listaDeTabelas = ObterEstruturaDeTabelasEColunas();
EscreveLog(DateTime.Now + “: Lista de Tabelas Obtida”);
EscreveLog(“TAREFA: Importar ” + listaDeTabelas.Count + ” Tabelas “);
ThreadStart status = new ThreadStart(Status);
Thread threadStatus = new Thread(status);
threadStatus.Priority = ThreadPriority.Lowest;
threadStatus.Start();
ParameterizedThreadStart persistir = new ParameterizedThreadStart(PersistirDados);
Thread threadPersistir = new Thread(persistir);
threadStatus.Priority = ThreadPriority.Highest;
threadPersistir.Start(listaDeTabelas);
}
Agora está o pulo do gato:
bool persistido = false;
while (!persistido)
{
try
{
SqlConnection conn = new SqlConnection(BANCODEDESTINO);
conn.Open();
SqlTransaction transaction = conn.BeginTransaction();
SqlBulkCopy bulk = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction);
bulk.DestinationTableName = “dbo.” + tabela.NomeTabela.ToUpper();
SqlBulkCopyColumnMappingCollection mapeamentoColunas = bulk.ColumnMappings;
bulk.BatchSize = 1000000;
bulk.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulk.NotifyAfter = 10000;
mapeamentoColunas.Clear();
foreach (Coluna coluna in tabela.ListaDeColunas)
{
mapeamentoColunas.Add(new SqlBulkCopyColumnMapping(coluna.NomeColuna, coluna.NomeColuna));
}
bulk.BulkCopyTimeout = 180;
try
{
EscreveLog(DateTime.Now + “: Gravando no banco”);
bulk.WriteToServer(dt);
transaction.Commit();
EscreveLog(DateTime.Now + “: Inserindo: Linha Inseridas ” + h);
persistido = true;
tabela.Processado = “s”;
}
catch (Exception erro)
{
transaction.Rollback();
EscreveLog(DateTime.Now + “: Ocorreu um erro ao persistir no banco – Erro: ” + erro.Message);
tentativa = tentativa + 1;
tabela.Processado = “e”;
}
finally
{
conn.Close();
}
}
catch (Exception erro)
{
EscreveLog(DateTime.Now + “: Ocorreu um erro ao persistir no banco – Erro: ” + erro.Message);
tentativa = tentativa + 1;
}
if (tentativa > 2)
{
persistido = true;
EscreveLog(DateTime.Now + “: Apos 3 tentativas a inclusao dos dados foi cancelada.”);
}
}
flw pessoal,
Até breve
Publicado por andrenobrega 




