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!
quinta-feira, 27 de novembro de 2014
terça-feira, 25 de novembro de 2014
Como criar um Crawler, Robo para nagevar pelo browser via programacao
Como criar um Crawler, Robô para navegar pelo browser via programação
Muito fácil!
Primeiro de tudo é preciso adicionar o Selenium WebDriver.
Fica mais fácil através da linha de comando do Nuget:
PM> Install-Package Selenium.WebDriver
Para mais detalhes de como instalar acesse:
http://www.nuget.org/packages/selenium.webdriver
Segue um exemplo simples de como implementar o robô com Selenium:
private static void ReturnUrl(string url, List<string> listaUrls)
{
IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl(url);
var query = driver.FindElements(By.XPath("//a[contains(@href,'nike.com.br')]"));
var urlExcecao = ConfigurationManager.AppSettings["UrlExcecao"];
var listaUrlsExcecao = urlExcecao.Split(',').ToList<string>();
foreach (var item in query)
listaUrls.Add(item.GetAttribute("href"));
var urlsRemovidas = 0;
foreach (var item in listaUrls.Distinct())
{
driver.Quit();
foreach (string itemExcecao in listaUrlsExcecao)
{
urlsRemovidas += listaUrls.Distinct().ToList().RemoveAll(str => str.Contains(item));
}
if (!listaFinal.Equals(item))
{
listaFinal.Add(item);
Console.Write(item + "\n");
ReturnUrl(item, listaUrls.Except(listaFinal).ToList());
}
}
Console.Read();
}
Muito Obrigado e até o próximo post!
Muito fácil!
Primeiro de tudo é preciso adicionar o Selenium WebDriver.
Fica mais fácil através da linha de comando do Nuget:
PM> Install-Package Selenium.WebDriver
Para mais detalhes de como instalar acesse:
http://www.nuget.org/packages/selenium.webdriver
Segue um exemplo simples de como implementar o robô com Selenium:
private static void ReturnUrl(string url, List<string> listaUrls)
{
IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl(url);
var query = driver.FindElements(By.XPath("//a[contains(@href,'nike.com.br')]"));
var urlExcecao = ConfigurationManager.AppSettings["UrlExcecao"];
var listaUrlsExcecao = urlExcecao.Split(',').ToList<string>();
foreach (var item in query)
listaUrls.Add(item.GetAttribute("href"));
var urlsRemovidas = 0;
foreach (var item in listaUrls.Distinct())
{
driver.Quit();
foreach (string itemExcecao in listaUrlsExcecao)
{
urlsRemovidas += listaUrls.Distinct().ToList().RemoveAll(str => str.Contains(item));
}
if (!listaFinal.Equals(item))
{
listaFinal.Add(item);
Console.Write(item + "\n");
ReturnUrl(item, listaUrls.Except(listaFinal).ToList());
}
}
Console.Read();
}
Muito Obrigado e até o próximo post!
Como fazer para concatenar mais de um campo no PIVOT
Depois de trabalhar com PIVOT, me deparei com outro problema: concatenar mais de um campo dentro do PIVOT.
No forum abaixo tem a pergunta e algumas soluções propostas:
http://stackoverflow.com/questions/27108762/pivot-sql-server-multiple-values-in-aggregate-function
Minha solução ficou da seguinte forma:
select * FROM
(select s.IdSKU, ca.Campo, [Valor] = Case when ca.Campo = 'cor' then REPLACE((Select distinct Valor AS [data()] from Colecao (NOLOCK) cl
INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cl.IdColecao
INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro
INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto
INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria
INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria
INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto
INNER JOIN SkuValorCampo (NOLOCK) svc ON svc.idSku = s.IdSKU
INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = svc.idValorCampo
INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo
where s.IdSKU = 309613 and ca.Campo = 'cor' FOR xml path('')),' ',',') else v.Valor end
FROM Colecao (NOLOCK) cli
INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cli.IdColecao
INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro
INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto
INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria
INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria
INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto
INNER JOIN SkuValorCampo (NOLOCK) svc ON svc.idSku = s.IdSKU
INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = svc.idValorCampo
INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo
where s.IdSKU = 309613
UNION
select s.IdSKU, ca.Campo, v.Valor
FROM Colecao (NOLOCK) cl
INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cl.IdColecao
INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro
INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto
INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria
INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria
INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto
INNER JOIN ProdutoValorCampo (NOLOCK) pvc ON pvc.idProduto = p.IdProduto
INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = pvc.idValorCampo
INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo
where s.IdSKU = 309613) AS t
PIVOT
(MAX(Valor)
FOR Campo IN (Tamanho,Cor,Gênero)) tt
Muito Obrigado e até o próximo post!
No forum abaixo tem a pergunta e algumas soluções propostas:
http://stackoverflow.com/questions/27108762/pivot-sql-server-multiple-values-in-aggregate-function
Minha solução ficou da seguinte forma:
select * FROM
(select s.IdSKU, ca.Campo, [Valor] = Case when ca.Campo = 'cor' then REPLACE((Select distinct Valor AS [data()] from Colecao (NOLOCK) cl
INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cl.IdColecao
INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro
INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto
INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria
INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria
INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto
INNER JOIN SkuValorCampo (NOLOCK) svc ON svc.idSku = s.IdSKU
INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = svc.idValorCampo
INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo
where s.IdSKU = 309613 and ca.Campo = 'cor' FOR xml path('')),' ',',') else v.Valor end
FROM Colecao (NOLOCK) cli
INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cli.IdColecao
INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro
INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto
INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria
INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria
INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto
INNER JOIN SkuValorCampo (NOLOCK) svc ON svc.idSku = s.IdSKU
INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = svc.idValorCampo
INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo
where s.IdSKU = 309613
UNION
select s.IdSKU, ca.Campo, v.Valor
FROM Colecao (NOLOCK) cl
INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cl.IdColecao
INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro
INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto
INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria
INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria
INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto
INNER JOIN ProdutoValorCampo (NOLOCK) pvc ON pvc.idProduto = p.IdProduto
INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = pvc.idValorCampo
INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo
where s.IdSKU = 309613) AS t
PIVOT
(MAX(Valor)
FOR Campo IN (Tamanho,Cor,Gênero)) tt
Muito Obrigado e até o próximo post!
sexta-feira, 21 de novembro de 2014
Assinar:
Postagens (Atom)