Copiar dados de um banco de dados para outros

Boa tarde

Gostaria de instrução de como criar uma rotina no LPA para que o sistema copie os dados de uma tabela existente em um banco de dados, para uma tabela dentro de outro banco de dados.

Obrigado

2 curtidas

Olá @Thiago, tudo bem?

Para fazer a cópia dos dados, de um banco de dados para o outro usando o LPA, você precisa criar um Formulário que faça esse intercâmbio, e depois programar a chamada deste Formulário no Agendador de Tarefas.

O intercâmbio entre esses dados precisa ser feito usando um Código C# no evento Load do Formulário.


Imagine que existam duas conexões de banco de dados cadastradas na plataforma. Uma se chama Conexao-1 e a outra Conexão-2, e em ambas temos uma tabela chamada resumo_pedidos com as colunas a seguir:

Coluna Tipo
idpedido Int
datapedido Date
idcliente Int
valortotal Numeric(10,2)

O código C# no evento Load do Formulário, ficaria assim:

using LATROMI.Extensions;

// Pega a "data inicial" de uma variável do Formulário 
// chamada "v_data_inicial" para usar como filtro no SELECT
var dataInicial = (DateTime)Variables["v_data_inicial"].Value;

// Monta o comando SELECT usando "StringBuilder"
var sqlSelect = new StringBuilder()
    .AppendLine("SELECT")
    .AppendLine(" id")
    .AppendLine(", datapedido")
    .AppendLine(", idlciente")
    .AppendLine(", valortotal")
    .AppendLine("FROM resumo_pedidos")
    .AppendLine("WHERE datapedido >= @datapedido");

// Monta o comando INSERT usando "StringBuilder"
var sqlInsert = new StringBuilder()
    .AppendLine("INSERT INTO resumo_pedidos (")
    .AppendLine(" id")
    .AppendLine(", datapedido")
    .AppendLine(", idlciente")
    .AppendLine(", valortotal")
    .AppendLine(") VALUES (")
    .AppendLine(" @id")
    .AppendLine(", @datapedido")
    .AppendLine(", @idlciente")
    .AppendLine(", @valortotal")
    .AppendLine(");");

// Abre as duas conexões
using (var conexao1 = Database.CreateConnection("Conexao-1"))
using (var conexao2 = Database.CreateConnection("Conexao-2"))
{
    // Abre as conexões
    conexao1.Open();
    conexao2.Open();
    
    // Lista de chave/valor que será usada para preencher os parâmetros do SELECT
    var parametrosSelect = new Dictionary<string, object>
    {
        { "@datapedido", dataInicial }
    };

    // Busca os dados da "Conexao-1"
    using (var dados = conexao1.ExecuteReader(sqlSelect.ToString(), parametrosSelect))
    {
        // Enquanto houver linhas, continuar percorrendo
        while (dados.Read())
        {
            // Lista de chave/valor que será usada para preencher os parâmetros do INSERT
            var parametrosInsert = new Dictionary<string, object>
            {
                { "@id",            dados["id"] },
                { "@datapedido",    dados["datapedido"] },
                { "@idlciente",     dados["idlciente"] },
                { "@valortotal",    dados["valortotal"] }
            };

            // Executa comando Insert na "Conexao-2"
            conexao2.ExecuteNonQuery(sqlInsert.ToString(), parametrosInsert);
        }
    }
}

Obviamente, este é um exemplo simples, onde a estrutura de dados entre os dois bancos é idêntica. Quando a estrutura for diferente, será necessário realizar a conversão entre os tipos de dados.

Se tiver alguma dificuldade para fazer a implementação, avise aqui neste tópico :slight_smile:

1 curtida

Excelente dica @daniel.giacomelli !!! :heart_eyes::heart_eyes::heart_eyes:

1 curtida