quinta-feira, 27 de novembro de 2014

Como fazer Update com Bulk Insert - Update em massa com planilha excel

Precisei fazer um UPDATE em massa a partir de uma planilha excel.

Cheguei a solução do BULK INSERT com UPDATE

Segue a Implementação:

private string IncluirSkuRecomendadoNoBanco(List<SkuRecomendadoImportacaoBE> recomendacoes)
        {
            var retorno = "sucesso";
            var totalLinhasAtualizadas = 0;
                                 
            //Cria arquivo de log
            StreamWriter writer = new StreamWriter("C:\\Users\\marcelo.braga\\Desktop\\log.txt");
            writer.WriteLine("IdSku;SkusRecomendados");
         
            //Converte List em DataTable
            var dt = new System.Data.DataTable();
            dt.Columns.Add("IdSkuPai");
            dt.Columns.Add("SkusRecomendados");

            foreach (var item in recomendacoes)
            {
                writer.WriteLine(item.IdSkuPai + ";" + item.SkusRecomendados);

                System.Data.DataRow dr = dt.NewRow();
                dr["IdSkuPai"] = item.IdSkuPai;
                dr["SkusRecomendados"] = item.SkusRecomendados;
                dt.Rows.Add(dr);
                dr.AcceptChanges();
            }

            var conn = new SqlConnection(GetConnection());
         
            try
            {
                conn.Open();

                //Bulk insert into temp table
                using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))
                {
                    bulkcopy.BulkCopyTimeout = 660;
                    bulkcopy.DestinationTableName = "TmpTable";
                    bulkcopy.WriteToServer(dt);
                    bulkcopy.Close();
                }

                //Update
                var queryUpadate = "UPDATE S SET S.SKUSRECOMENDADOS = Temp.SkusRecomendados FROM SKU S INNER JOIN TmpTable Temp ON S.IDSKU = Temp.IdSkuPai;";
                using (var cmd = new SqlCommand(queryUpadate, conn))
                {
                    cmd.CommandTimeout = int.MaxValue;
                    totalLinhasAtualizadas = cmd.ExecuteNonQuery();

                    writer.WriteLine("Total de registros atualizados: " + totalLinhasAtualizadas);
                }
            }
            catch (Exception ex)
            {
                writer.WriteLine("Erro: " + ex.Message);
                writer.Close();
            }
            finally
            {
                conn.Close();
            }

            return retorno;
        }

Não esqueça de criar a tabela no banco:

CREATE TABLE TmpTable(IdSkuPai INT,SkusRecomendados VARCHAR(MAX));

Fonte: http://stackoverflow.com/questions/20635796/bulk-update-in-c-sharp

Muito Obrigado e até o próximo post!


Nenhum comentário:

Postar um comentário