Lógica para atualizar ou inserir somente registros pendentes.
This commit is contained in:
parent
441a70edaf
commit
b340b9ef46
92
Program.cs
92
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<dynamic>();
|
||||
var alterados = new List<dynamic>();
|
||||
|
||||
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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user