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)
|
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)
|
foreach (var m in medidasProcessadas)
|
||||||
{
|
{
|
||||||
// Primeiro tenta UPDATE
|
var chave = (m.Ponto, m.DiaNum, m.Minuto);
|
||||||
string sqlUpdate = @"
|
|
||||||
|
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
|
UPDATE med_5min
|
||||||
SET origem = @origem,
|
SET origem = @origem,
|
||||||
ativa_consumo = @ativa_c,
|
ativa_consumo = @ativa_consumo,
|
||||||
ativa_geracao = @ativa_g,
|
ativa_geracao = @ativa_geracao,
|
||||||
reativa_consumo = @reat_c,
|
reativa_consumo = @reativa_consumo,
|
||||||
reativa_geracao = @reat_g
|
reativa_geracao = @reativa_geracao
|
||||||
WHERE ponto = @ponto
|
WHERE ponto = @ponto
|
||||||
AND dia_num = @dia_num
|
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("origem", m.Origem);
|
||||||
cmdUpdate.Parameters.AddWithValue("ativa_c", m.AtivaC);
|
cmdUpdate.Parameters.AddWithValue("ativa_c", m.AtivaC);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user