From ec61534f17fb1416e13d95e0f7ed87f032783bc9 Mon Sep 17 00:00:00 2001 From: Adriano Serighelli Date: Thu, 18 Sep 2025 13:52:35 -0300 Subject: [PATCH] =?UTF-8?q?Altera=C3=A7=C3=A3o=20de=20estrtura=20de=20c?= =?UTF-8?q?=C3=B3digo=20para=20trabalhar=20de=20forma=20paralela.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program.cs | 467 ++++++++++++++++++++++------------------------------- 1 file changed, 191 insertions(+), 276 deletions(-) diff --git a/Program.cs b/Program.cs index c436926..25dfe77 100644 --- a/Program.cs +++ b/Program.cs @@ -1,171 +1,134 @@ -// See https://aka.ms/new-console-template for more information -using Npgsql; +using System.Collections.Concurrent; using System.Data; using System.Data.OleDb; using System.Globalization; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; using System.Text; -using System.Xml; using System.Xml.Linq; +using Npgsql; internal class Plat_integ { static string PG_CONN_STRING_PROD = "Server = smart-energia-dev-pgsql.cykff7tj7mik.us-east-1.rds.amazonaws.com; Port = 5432; Database = smartenergiaprod; User Id = postgres; Password = VfHml#Z78!%kvvNM; Timeout = 300;CommandTimeout = 300"; - public static IEnumerable? pag_ant; - static void Main() - { - down_sync(); //metodo sincrono + static readonly HttpClient client = new HttpClient(new HttpClientHandler { + ClientCertificateOptions = ClientCertificateOption.Automatic, + Proxy = new WebProxy("127.0.0.1", 8888), + UseProxy = true, + ServerCertificateCustomValidationCallback = (HttpRequestMessage req, X509Certificate2? cert, X509Chain? chain, SslPolicyErrors errors) => true + }); - Console.WriteLine("" + - "Pressione qualquer tecla para finalizar"); - _ = Console.ReadLine(); - Environment.Exit(0); - return; - } - public static void down_sync() + static async Task Main() { - string caminho_BD, caminho_log; - DateTime tempo_ini; - List> lt_perf_pto; - Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB"); + DateTime inicio = DateTime.Now; - //auxiliar para calculo do tempo de execucao do codigo - tempo_ini = DateTime.Now; + string caminhoBD = @"\\srv-dados\documentos\Middle\Informativo Setorial\Modelo Word\BD1_dados cadastrais e faturas.accdb"; + string caminhoLog = $@"\\srv-dados\documentos\Back\Carteira x.x\Codigo\Erros\log_erros_{DateTime.Now:MM_dd_HH_mm}.csv"; - //busca os dados para compor a lista perfis x - caminho_BD = @"\\srv-dados\documentos\Middle\Informativo Setorial\Modelo Word\BD1_dados cadastrais e faturas.accdb"; - caminho_log = @"\\srv-dados\documentos\Back\Carteira x.x\Codigo\Erros\log_erros_" + DateTime.Now.Month + "_" + DateTime.Now.Day + "_" + DateTime.Now.Hour + "_" + DateTime.Now.Second + ".csv"; - lt_perf_pto = Busca_dad_BD(caminho_BD); + var perfis = Busca_dad_BD(caminhoBD); - //exlclui os dados do mes atual salvos no BD - caminho_BD = @"\\srv-dados\documentos\Back\Carteira x.x\Gestão Geral v1\Access\BDs teste\DB_med_5min.accdb"; DateTime now = DateTime.Now; - DateTime data_ini; - DateTime data_fim; + //DateTime dataIni = new DateTime(now.Year, now.Month, 1); + //DateTime dataFim = new DateTime(now.Year, now.Month, now.Day); + DateTime dataIni = new DateTime(now.Year, 7, 1); + DateTime dataFim = new DateTime(now.Year, 8, 1); - //configuração mês atual - data_ini = new DateTime(now.Year, now.Month, 1); - data_fim = new DateTime(now.Year, now.Month, now.Day); + await ProcessarMedicoesAsync(dataIni, dataFim, perfis, caminhoLog); - Exclui_med(data_ini.ToOADate(), data_fim.ToOADate(), caminho_BD); + Console.WriteLine($"Concluído. Tempo total: {DateTime.Now - inicio}"); - NpgsqlConnection pg_conn; - - pg_conn = new(PG_CONN_STRING_PROD); - - //loop para cada dia e cada cod ponto salvando os dados no BD - req_sincrona(data_ini, data_fim, lt_perf_pto, pg_conn, caminho_log); - - Console.WriteLine("Concluido. Tempo TOTAL de execucao: {0}", DateTime.Now - tempo_ini); + Console.ReadKey(); } - - //busca lista de PerfisCCEE e codigos ponto de medicao no BD cadastral public static List> Busca_dad_BD(string caminho_BD) { - var lt_perf_pto = new List>(); - - string strCOM; - int i; + var lista = new List>(); //strCOM = "SELECT Cod_5min, Codigo_SCDE FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 AND Unidade_gerenciada = TRUE ORDER BY PerfilCCEE"; - strCOM = "SELECT Cod_5min, Codigo_SCDE FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'PENHASCO GRANITOS' ORDER BY PerfilCCEE"; + string query = "SELECT Cod_5min, Codigo_SCDE FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'TECNOGRAN' ORDER BY PerfilCCEE"; //strCOM = "SELECT Cod_5min, Codigo_SCDE FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'ALMAVIVA' and Unidade = 'GUARULHOS' ORDER BY PerfilCCEE"; - OleDbConnection conn = new("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + caminho_BD + ";Jet OLEDB:Database Password=gds21"); + using var conn = new OleDbConnection($"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={caminho_BD};Jet OLEDB:Database Password=gds21"); conn.Open(); - OleDbCommand tcDC = new(strCOM, conn); - OleDbDataReader reader = tcDC.ExecuteReader(); - i = 0; + using var cmd = new OleDbCommand(query, conn); + using var reader = cmd.ExecuteReader(); + while (reader.Read()) - { - lt_perf_pto.Add(new Tuple(reader["Cod_5min"].ToString(), reader["Codigo_SCDE"].ToString())); - i++; - } + lista.Add(new Tuple(reader["Cod_5min"].ToString(), reader["Codigo_SCDE"].ToString())); - conn.Close(); - return lt_perf_pto; + return lista; } - //Exlclui dados do mes atual no BD medicoes - public static void Exclui_med(double data_ini, double data_fim, string caminho_BD) + private static async Task ProcessarMedicoesAsync(DateTime dataIni, DateTime dataFim, List> perfis, string caminhoLog) { - NpgsqlConnection pg_conn; + var errosPersistentes = new ConcurrentBag(); - pg_conn = new(PG_CONN_STRING_PROD); + //using var conn = new NpgsqlConnection(PG_CONN_STRING_PROD); + //await conn.OpenAsync(); + await using var dataSource = NpgsqlDataSource.Create(PG_CONN_STRING_PROD); - pg_conn.Open(); - //string pg_strCOM = "DELETE FROM med_5min WHERE dia_num >= " + data_ini + " AND dia_num < " + data_fim; - string pg_strCOM = "DELETE FROM med_5min WHERE dia_num >= " + data_ini + " AND dia_num < " + data_fim + " AND ponto = 'ESPMSOENTR101P'"; - NpgsqlCommand pg_tcSCDE = new(pg_strCOM, pg_conn); - NpgsqlDataReader pg_reader = pg_tcSCDE.ExecuteReader(); - pg_reader.Close(); - pg_conn.Close(); - - return; - } - - public static void req_sincrona(DateTime data_inicial, DateTime data_final, List> lt_perf_pto, NpgsqlConnection pg_conn, string caminho_log) - { - string log_erros; - int i; - long erros = 0; - var handler = new HttpClientHandler(); - int tam_arr; - tam_arr = ((data_final - data_inicial).Days) * lt_perf_pto.Count; - - handler.ClientCertificateOptions = ClientCertificateOption.Automatic; - - DateTime aux_tempo = DateTime.Now; - var client = new HttpClient(handler); + //client.DefaultRequestHeaders.Clear(); client.DefaultRequestHeaders.Add("SOAPAction", "listarMedidaCincoMinutos"); - var endpoint = new Uri("https://servicos.ccee.org.br:443/ws/v2/MedidaCincoMinutosBSv2"); + var endpoint = new Uri("https://servicos.ccee.org.br/ws/v2/MedidaCincoMinutosBSv2"); - i = 0; - log_erros = "Perfil;Ponto;Status;Message\n"; + var datas = Enumerable.Range(0, (dataFim - dataIni).Days).Select(i => dataIni.AddDays(i)); - while (data_inicial < data_final) + await Parallel.ForEachAsync(datas/*, new ParallelOptions { MaxDegreeOfParallelism = 1 }*/, async (dia, ct) => { - foreach (Tuple item in lt_perf_pto) + foreach (var item in perfis) { - int pagina = 1; - int paginasTotal = 1; - try - { - while (pagina <= paginasTotal) - { - var payload = new StringContent(Xml_requisicao(data_inicial, item.Item1, item.Item2, pagina), Encoding.UTF8, "application/json"); - var retorno = client.PostAsync(endpoint, payload).Result.Content.ReadAsStringAsync().Result.ToString(); - Console.WriteLine("Processando requisicao {0,5}, Perf: {1,6}, Ponto: {2,10}, Página: {3}", i, item.Item1, item.Item2, pagina); - if (pg_conn != null && pg_conn.State == ConnectionState.Closed) - { - pg_conn.Open(); - } - paginasTotal = processar_XML_sincrono(retorno, pg_conn); + int tentativas = 0; + bool sucesso = false; - pagina++; + while (tentativas < 5 && !sucesso) + { + try + { + string payload = Xml_requisicao(dia, item.Item1, item.Item2, 1); + var conteudo = new StringContent(payload, Encoding.UTF8, "application/xml"); + + using var response = await client.PostAsync(endpoint, conteudo, ct); + + if ((int)response.StatusCode == 429) // limite da API + { + Console.WriteLine("⚠️ Limite de requisições atingido. Aguardando próximo minuto..."); + var now = DateTime.UtcNow; + var delay = 60000 - (now.Second * 1000 + now.Millisecond); + await Task.Delay(delay, ct); + continue; // tentar de novo sem contar como falha + } + + response.EnsureSuccessStatusCode(); + + string resposta = await response.Content.ReadAsStringAsync(ct); + await ProcessarXMLAsync(resposta, await dataSource.OpenConnectionAsync()); + + sucesso = true; + } + catch (Exception ex) + { + tentativas++; + if (tentativas == 5) + { + errosPersistentes.Add($"{item.Item1};{item.Item2};Erro;{ex.Message.Replace("\n", "-n-")}"); + } + else + { + int backoff = (int)Math.Pow(2.4, tentativas) * 1000; // exponencial + Console.WriteLine($"Erro na requisição ({ex.Message}), tentativa {tentativas}. Aguardando {backoff / 1000}s..."); + await Task.Delay(backoff, ct); + } } } - catch (Exception he) - { - Console.WriteLine(he.Message); - Console.WriteLine("caught exception"); - erros++; - log_erros += item.Item1 + ";" + item.Item2 + ";Erro;" + he.Message.Replace("\n", "-n-") + "\n"; - continue; - } - - i++; - pag_ant = null; } - data_inicial = data_inicial.AddDays(1); + }); + + if (errosPersistentes.Count > 0) + { + File.WriteAllLines(caminhoLog, new[] { "Perfil;Ponto;Status;Message" }.Concat(errosPersistentes)); } - - Console.WriteLine("Houve {0} requisicoes, com {1} erros", i, erros); - File.WriteAllText(caminho_log, log_erros); - client.Dispose(); } - - //prepara o xml de entrada a ser enviado à CCEE public static string Xml_requisicao(DateTime data_req, string perfil, string cod_ponto, int pagina) { string cam_ent, tex_req, sdat_req; @@ -179,175 +142,127 @@ internal class Plat_integ tex_req = tex_req.Replace("PAGNUM", pagina.ToString()); return tex_req; } - public static int processar_XML_sincrono(string entrada, NpgsqlConnection pg_conn) + private static async Task ProcessarXMLAsync(string xml, NpgsqlConnection connection, List? acumulador = null, int paginaAtual = 1, int totalPaginas = 1) { - XmlDocument doc = new XmlDocument(); - doc.LoadXml(entrada); - DateTime aux_data = new DateTime(2005, 01, 01); - DateTime tempo_xml; - string access_strCOM, log_erros; - XElement pag_atual; + var doc = XDocument.Parse(xml); + XNamespace ns = "http://xmlns.energia.org.br/BO/v2"; - pag_atual = XElement.Parse(entrada); - tempo_xml = DateTime.Now; + int.TryParse(doc.Descendants().FirstOrDefault(e => e.Name.LocalName == "totalPaginas")?.Value, out totalPaginas); + int.TryParse(doc.Descendants().FirstOrDefault(e => e.Name.LocalName == "numero")?.Value, out paginaAtual); - double data, ativa_g, ativa_c, reat_g, reat_c; - long min; - string ponto, origem; - XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); - nsmgr.AddNamespace("hdr", "http://xmlns.energia.org.br/MH/v2"); - nsmgr.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope"); - nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); - nsmgr.AddNamespace("bmv2", "http://xmlns.energia.org.br/BM/v2"); - nsmgr.AddNamespace("bov2", "http://xmlns.energia.org.br/BO/v2"); + var medidas = doc.Descendants(ns + "medida") + .Where(x => (string)x.Element(ns + "tipoEnergia") == "L"); + acumulador ??= new List(); + acumulador.AddRange(medidas); - if (pg_conn.State != ConnectionState.Open) + //if (paginaAtual < totalPaginas) + //{ + // // Requisita próxima página + // string payload = Xml_requisicao(DateTime.Parse(acumulador.First().Element(ns + "data")!.Value), // data de referência + // acumulador.First().Element(ns + "perfil")?.Value ?? "", // perfil (ajustar conforme necessário) + // acumulador.First().Element(ns + "medidor")?.Element(ns + "codigo")?.Value ?? "", + // paginaAtual + 1); + + // var conteudo = new StringContent(payload, Encoding.UTF8, "application/xml"); + // using var resp = await client.PostAsync("https://servicos.ccee.org.br/ws/v2/MedidaCincoMinutosBSv2", conteudo); + + // string proxXml = await resp.Content.ReadAsStringAsync(); + // return await ProcessarXMLAsync(proxXml, conn, acumulador, paginaAtual + 1, totalPaginas); + //} + + var medidasProcessadas = acumulador + .Select(m => { - pg_conn.Open(); - } + string origem = m.Element(ns + "coletaMedicao")?.Element(ns + "tipo")?.Element(ns + "nome")?.Value ?? ""; + string ponto = m.Element(ns + "medidor")?.Element(ns + "codigo")?.Value ?? ""; + DateTime data = DateTime.Parse(m.Element(ns + "data")?.Value ?? ""); + double diaNum = (data.ToOADate() - data.ToOADate() % 1); + int minuto = data.Hour * 60 + data.Minute; + if (minuto == 0) { minuto = 1440; diaNum--; } - log_erros = "Origem;Ponto;Status;Message\n"; + double.TryParse(m.Element(ns + "energiaAtiva")?.Element(ns + "consumo")?.Element(ns + "valor")?.Value, out double ativa_c); + double.TryParse(m.Element(ns + "energiaAtiva")?.Element(ns + "geracao")?.Element(ns + "valor")?.Value, out double ativa_g); + double.TryParse(m.Element(ns + "energiaReativa")?.Element(ns + "consumo")?.Element(ns + "valor")?.Value, out double reat_c); + double.TryParse(m.Element(ns + "energiaReativa")?.Element(ns + "geracao")?.Element(ns + "valor")?.Value, out double reat_g); - ponto = ""; - origem = ""; - - - if (pag_ant == null) - { - XNamespace ns = "http://xmlns.energia.org.br/BO/v2"; - - pag_ant = pag_atual.Descendants(ns + "medida").Where(x => x.Element(ns + "tipoEnergia").Value == "L"); - } - else - { - XNamespace ns = "http://xmlns.energia.org.br/BO/v2"; - pag_ant = pag_ant.Concat(pag_atual.Descendants(ns + "medida").Where(x => x.Element(ns + "tipoEnergia").Value == "L")); - } - - try - { - int num_pag = 1; - foreach (XmlNode n1 in doc.GetElementsByTagName("hdr:totalPaginas")) + return new { - int.TryParse(n1.InnerText, out num_pag); - } - int num_pag_atual = 1; - foreach (XmlNode n1 in doc.GetElementsByTagName("hdr:numero")) + Origem = origem, + Ponto = ponto, + DiaNum = diaNum, + Minuto = minuto, + AtivaC = ativa_c, + AtivaG = ativa_g, + ReatC = reat_c, + ReatG = reat_g + }; + }) + .GroupBy(x => new { x.Ponto, x.DiaNum, x.Minuto }) + .Select(g => + { + // Se houver alguma Inspeção Lógica → prioriza + var logica = g.FirstOrDefault(x => x.Origem == "Inspeção Lógica"); + return logica ?? g.First(); // se não tiver lógica, pega qualquer (coleta diária) + }); + + foreach (var m in medidasProcessadas) + { + // Primeiro tenta UPDATE + string sqlUpdate = @" + UPDATE med_5min + SET origem = @origem, + ativa_consumo = @ativa_c, + ativa_geracao = @ativa_g, + reativa_consumo = @reat_c, + reativa_geracao = @reat_g + WHERE ponto = @ponto + AND dia_num = @dia_num + AND minuto = @minuto;"; + + using (var cmdUpdate = new NpgsqlCommand(sqlUpdate, connection)) { - int.TryParse(n1.InnerText, out num_pag_atual); - } - if (num_pag_atual == num_pag) - { - XmlNode node_ant = doc.SelectNodes("//bov2:medida", nsmgr).Item(5); - using (var pg_writer = pg_conn.BeginBinaryImport("COPY med_5min (origem, dia_num, minuto, ativa_consumo, ativa_geracao, reativa_consumo, reativa_geracao, ponto) FROM STDIN (FORMAT BINARY)")) + cmdUpdate.Parameters.AddWithValue("origem", m.Origem); + cmdUpdate.Parameters.AddWithValue("ativa_c", m.AtivaC); + cmdUpdate.Parameters.AddWithValue("ativa_g", m.AtivaG); + cmdUpdate.Parameters.AddWithValue("reat_c", m.ReatC); + cmdUpdate.Parameters.AddWithValue("reat_g", m.ReatG); + cmdUpdate.Parameters.AddWithValue("ponto", m.Ponto); + cmdUpdate.Parameters.AddWithValue("dia_num", m.DiaNum); + cmdUpdate.Parameters.AddWithValue("minuto", m.Minuto); + + int rowsAffected = await cmdUpdate.ExecuteNonQueryAsync(); + + if (rowsAffected == 1) { - for (int i = 0; i < pag_ant.Count(); i++) - { - XmlDocument nodeDoc = new XmlDocument(); - nodeDoc.LoadXml(pag_ant.ElementAt(i).ToString()); - XmlNode node = nodeDoc.SelectSingleNode("//bov2:medida", nsmgr); + Console.WriteLine("atualizado"); + } + // Se não atualizou ninguém → faz INSERT + if (rowsAffected == 0) + { + string sqlInsert = @" + INSERT INTO med_5min + (origem, dia_num, minuto, ativa_consumo, ativa_geracao, reativa_consumo, reativa_geracao, ponto) + VALUES (@origem, @dia_num, @minuto, @ativa_c, @ativa_g, @reat_c, @reat_g, @ponto); + "; - if (node.SelectSingleNode("bov2:coletaMedicao//bov2:tipo//bov2:nome", nsmgr).InnerText == "Inspeção Lógica") - { - aux_data = DateTime.ParseExact(node.SelectSingleNode("bov2:data", nsmgr).InnerText, "yyyy-MM-dd'T'HH:mm:ss'-03:00'", null); - data = (aux_data.ToOADate() - aux_data.ToOADate() % 1); - min = aux_data.Hour * 60 + aux_data.Minute; + using var cmdInsert = new NpgsqlCommand(sqlInsert, connection); + cmdInsert.Parameters.AddWithValue("origem", m.Origem); + cmdInsert.Parameters.AddWithValue("dia_num", m.DiaNum); + cmdInsert.Parameters.AddWithValue("minuto", m.Minuto); + cmdInsert.Parameters.AddWithValue("ativa_c", m.AtivaC); + cmdInsert.Parameters.AddWithValue("ativa_g", m.AtivaG); + cmdInsert.Parameters.AddWithValue("reat_c", m.ReatC); + cmdInsert.Parameters.AddWithValue("reat_g", m.ReatG); + cmdInsert.Parameters.AddWithValue("ponto", m.Ponto); - if (min == 0) - { - min = 1440; - data = data - 1; - } + await cmdInsert.ExecuteNonQueryAsync(); - ponto = node.SelectSingleNode("bov2:medidor//bov2:codigo", nsmgr).InnerText; - origem = node.SelectSingleNode("bov2:coletaMedicao//bov2:tipo//bov2:nome", nsmgr).InnerText; - - Double.TryParse(node.SelectSingleNode("bov2:energiaAtiva//bov2:consumo//bov2:valor", nsmgr).InnerText, out ativa_c); - Double.TryParse(node.SelectSingleNode("bov2:energiaAtiva//bov2:geracao//bov2:valor", nsmgr).InnerText, out ativa_g); - Double.TryParse(node.SelectSingleNode("bov2:energiaReativa//bov2:consumo//bov2:valor", nsmgr).InnerText, out reat_c); - Double.TryParse(node.SelectSingleNode("bov2:energiaReativa//bov2:geracao//bov2:valor", nsmgr).InnerText, out reat_g); - - access_strCOM = "INSERT INTO Med_5min (Origem, Data, Minuto, Ativa_consumo, Ativa_geracao, Reativa_consumo, Reativa_geracao, Ponto)"; - access_strCOM += " VALUES (\"" + origem + "\"," + data + "," + min + "," + ativa_c + "," + ativa_g + "," + reat_c + "," + reat_g + ",\"" + ponto + "\")"; - - pg_writer.StartRow(); - pg_writer.Write(origem); - pg_writer.Write(data, NpgsqlTypes.NpgsqlDbType.Numeric); - pg_writer.Write(min, NpgsqlTypes.NpgsqlDbType.Integer); - pg_writer.Write(ativa_c, NpgsqlTypes.NpgsqlDbType.Numeric); - pg_writer.Write(ativa_g, NpgsqlTypes.NpgsqlDbType.Numeric); - pg_writer.Write(reat_c, NpgsqlTypes.NpgsqlDbType.Numeric); - pg_writer.Write(reat_g, NpgsqlTypes.NpgsqlDbType.Numeric); - pg_writer.Write(ponto); - //PGSQL END - node_ant = node; - } - else if (node.SelectSingleNode("bov2:coletaMedicao//bov2:tipo//bov2:nome", nsmgr).InnerText == "Coleta Diária") - { - var data_fut = "a"; - if (i + 1 < pag_ant.Count()) - { - data_fut = pag_ant.ElementAt(i + 1).Element("{http://xmlns.energia.org.br/BO/v2}data").Value; - } - - var data_atual = node.SelectSingleNode("bov2:data", nsmgr).InnerText; - var data_ant = "a"; - if (i != 0) - { - data_ant = node_ant.SelectSingleNode("bov2:data", nsmgr).InnerText; - } - - if (data_ant != data_atual && data_fut != data_atual) - { - aux_data = DateTime.ParseExact(node.SelectSingleNode("bov2:data", nsmgr).InnerText, "yyyy-MM-dd'T'HH:mm:ss'-03:00'", null); - data = (aux_data.ToOADate() - aux_data.ToOADate() % 1); - min = aux_data.Hour * 60 + aux_data.Minute; - - if (min == 0) - { - min = 1440; - data = data - 1; - } - - ponto = node.SelectSingleNode("bov2:medidor//bov2:codigo", nsmgr).InnerText; - origem = node.SelectSingleNode("bov2:coletaMedicao//bov2:tipo//bov2:nome", nsmgr).InnerText; - - Double.TryParse(node.SelectSingleNode("bov2:energiaAtiva//bov2:consumo//bov2:valor", nsmgr).InnerText, out ativa_c); - Double.TryParse(node.SelectSingleNode("bov2:energiaAtiva//bov2:geracao//bov2:valor", nsmgr).InnerText, out ativa_g); - Double.TryParse(node.SelectSingleNode("bov2:energiaReativa//bov2:consumo//bov2:valor", nsmgr).InnerText, out reat_c); - Double.TryParse(node.SelectSingleNode("bov2:energiaReativa//bov2:geracao//bov2:valor", nsmgr).InnerText, out reat_g); - - - access_strCOM = "INSERT INTO Med_5min (Origem, Data, Minuto, Ativa_consumo, Ativa_geracao, Reativa_consumo, Reativa_geracao, Ponto)"; - access_strCOM += " VALUES (\"" + origem + "\"," + data + "," + min + "," + ativa_c + "," + ativa_g + "," + reat_c + "," + reat_g + ",\"" + ponto + "\")"; - - pg_writer.StartRow(); - pg_writer.Write(origem); - pg_writer.Write(data, NpgsqlTypes.NpgsqlDbType.Numeric); - pg_writer.Write(min, NpgsqlTypes.NpgsqlDbType.Integer); - pg_writer.Write(ativa_c, NpgsqlTypes.NpgsqlDbType.Numeric); - pg_writer.Write(ativa_g, NpgsqlTypes.NpgsqlDbType.Numeric); - pg_writer.Write(reat_c, NpgsqlTypes.NpgsqlDbType.Numeric); - pg_writer.Write(reat_g, NpgsqlTypes.NpgsqlDbType.Numeric); - pg_writer.Write(ponto); - //PGSQL END - } - node_ant = node; - } - } - pg_writer.Complete(); + Console.WriteLine("inserido"); } } - return num_pag; - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - log_erros += origem + ";" + ponto + ";Erro;" + ex.Message.Replace("\n", "-n-") + "\n"; - string caminho_log_sec = @"\\srv-dados\documentos\Back\Carteira x.x\Codigo\Erros\log_sec_erros_" + DateTime.Now.Month + "_" + DateTime.Now.Day + "_" + DateTime.Now.Hour + "_" + DateTime.Now.Second + "_" + DateTime.Now.Millisecond + "_sec.csv"; - File.WriteAllText(caminho_log_sec, log_erros); - return 1; } + + return totalPaginas; } } \ No newline at end of file