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