From b340b9ef4625c6d9eafb9222d6eb4803c94a19a3 Mon Sep 17 00:00:00 2001 From: Adriano Serighelli Date: Tue, 30 Sep 2025 13:23:37 -0300 Subject: [PATCH] =?UTF-8?q?L=C3=B3gica=20para=20atualizar=20ou=20inserir?= =?UTF-8?q?=20somente=20registros=20pendentes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program.cs | 92 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 8 deletions(-) diff --git a/Program.cs b/Program.cs index b182959..963a560 100644 --- a/Program.cs +++ b/Program.cs @@ -291,21 +291,97 @@ internal class Plat_integ return logica ?? g.First(); // se não tiver lógica, pega qualquer (coleta diária) }); + var novos = new List(); + var alterados = new List(); + foreach (var m in medidasProcessadas) { - // Primeiro tenta UPDATE - string sqlUpdate = @" + var chave = (m.Ponto, m.DiaNum, m.Minuto); + + if (!existentes.TryGetValue(chave, out var existente)) + { + // não existe → inserir + novos.Add(m); + } + else + { + // existe mas mudou → atualizar + if (existente.Origem != m.Origem || + existente.AtivaC != m.AtivaC || + existente.AtivaG != m.AtivaG || + existente.ReatC != m.ReatC || + existente.ReatG != m.ReatG) + { + alterados.Add(m); + } + } + } + + if (novos.Any()) + { + await using (var connection = await dataSource.OpenConnectionAsync(ct)) + { + using var writer = connection.BeginBinaryImport("COPY med_5min (origem, dia_num, minuto, ativa_consumo, ativa_geracao, reativa_consumo, reativa_geracao, ponto) FROM STDIN (FORMAT BINARY)"); + + foreach (var m in novos) + { + writer.StartRow(); + writer.Write(m.Origem); + writer.Write(m.DiaNum, NpgsqlTypes.NpgsqlDbType.Numeric); + writer.Write(m.Minuto, NpgsqlTypes.NpgsqlDbType.Integer); + writer.Write(m.AtivaC, NpgsqlTypes.NpgsqlDbType.Numeric); + writer.Write(m.AtivaG, NpgsqlTypes.NpgsqlDbType.Numeric); + writer.Write(m.ReatC, NpgsqlTypes.NpgsqlDbType.Numeric); + writer.Write(m.ReatG, NpgsqlTypes.NpgsqlDbType.Numeric); + writer.Write(m.Ponto); + } + + await writer.CompleteAsync(); + } + Console.WriteLine($"Inserido {novos.Count} registros. Ponto {ponto}. Dia {dia}"); + } + + if (alterados.Any()) + { + await using (var connection = await dataSource.OpenConnectionAsync(ct)) + { + using (var batch = new NpgsqlBatch(connection)) + { + foreach (var m in alterados) + { + var cmd = new NpgsqlBatchCommand(@" UPDATE med_5min SET origem = @origem, - ativa_consumo = @ativa_c, - ativa_geracao = @ativa_g, - reativa_consumo = @reat_c, - reativa_geracao = @reat_g + ativa_consumo = @ativa_consumo, + ativa_geracao = @ativa_geracao, + reativa_consumo = @reativa_consumo, + reativa_geracao = @reativa_geracao WHERE ponto = @ponto AND dia_num = @dia_num - AND minuto = @minuto;"; + AND minuto = @minuto;"); - using (var cmdUpdate = new NpgsqlCommand(sqlUpdate, connection)) + // Adiciona os parâmetros de forma segura + cmd.Parameters.AddWithValue("origem", m.Origem); + cmd.Parameters.AddWithValue("ativa_consumo", m.AtivaC); + cmd.Parameters.AddWithValue("ativa_geracao", m.AtivaG); + cmd.Parameters.AddWithValue("reativa_consumo", m.ReatC); + cmd.Parameters.AddWithValue("reativa_geracao", m.ReatG); + cmd.Parameters.AddWithValue("ponto", m.Ponto); + cmd.Parameters.AddWithValue("dia_num", m.DiaNum); + cmd.Parameters.AddWithValue("minuto", m.Minuto); + + batch.BatchCommands.Add(cmd); + } + + // Executa o lote de comandos de uma vez + await batch.ExecuteNonQueryAsync(); + Console.WriteLine($"Atualizado {alterados.Count} registros. Ponto {ponto}. Dia {dia}"); + } + } + } + return; + } + public class SoapFaultException : Exception { cmdUpdate.Parameters.AddWithValue("origem", m.Origem); cmdUpdate.Parameters.AddWithValue("ativa_c", m.AtivaC);