Como executar um Comando SQL em outro banco de dados no Formulário?

No Formulário Dinâmico, apenas uma Conexão de Banco de Dados pode ser selecionada para ser usada nas Fontes de Dados e instruções dos Procedimentos. No entanto, em alguns casos pode ser necessário executar algum Comando SQL em outro banco de dados.

Neste tópico vamos descobrir como executar um Comando SQL em outro banco de dados usando a linguagem C#.

Tabela

Neste exemplo, vamos inserir um registro na seguinte tabela.

CREATE TABLE clientes 
(
   cnpj VARCHAR(14) NOT NULL,
   razaosocial VARCHAR(255)
);
ALTER TABLE clientes ADD CONSTRAINT pk_clientes_cnpj PRIMARY KEY (cnpj)

Formulário

Vamos mostrar como executar o mesmo Comando SQL de duas formas diferentes:

  1. Usando valores de campos da tela.
  2. Usando valores de uma Record.

Nas duas situações, a primeira coisa a se fazer e ter uma Conexão de Banco de Dados cadastrada apontando para o banco onde você deseja gravar os dados. Neste exemplo, o nome da conexão será “DB Clientes”.

O próxima passo é adicionar a instrução “Executar comando C#” no Procedimento onde você quer realizar a gravação:

Usando Campo de Tela

Supondo que no Formulário existam os seguintes campos:

  • txtCnpj: TextBox com o CNPJ do Cliente.
  • txtRazaoSocial: TextBox com a Razão Social do Cliente.

O código C# Ficaria assim:

using LATROMI.Extensions;

// Abre a conexão 
using (var connection = Database.CreateConnection("DB Clientes"))
{
      // Monta dicionário com o valor dos parâmetros 
      // que serão usados no comando SQL
      var commandParameters = new Dictionary<string, object> 
      {
         ["@cnpj"]         = Fields["txtCnpj"].Value,
         ["@razaosocial"]  = Fields["txtRazaoSocial"].Value
      };
      
      // Executa comando SQL usando os parâmetros do dicionário
      connection.ExecuteNonQuery(
         "INSERT INTO clientes (cnpj, razaosocial) " +
         "VALUES (@cnpj, @razaosocial)", commandParameters);
}

Usando Campos da Record

Supondo que no Procedimento onde você vai implementar a gravação exista uma Record chamada “rCliente”, retornando os campos cnpj e razaosocial.

O código C# ficariam assim:

using LATROMI.Extensions;

// A record será retornada no formato Dictionary<string, object>.
var rClientes = GetRecord('rClientes');

// Para acessar um campo da Record seria assim:
//    rClientes["nome_do_campo"]

// Abre a conexão 
using (var connection = Database.CreateConnection("DB Clientes"))
{
   // Monta dicionário com o valor dos parâmetros 
   // que serão usados no comando SQL
   var commandParameters = new Dictionary<string, object> 
   {
      ["@cnpj"]         = rClientes["cnpj"],
      ["@razaosocial"]  = rClientes["razaosocial"]
   };
   
   // Executa comando SQL usando os parâmetros do dicionário
   connection.ExecuteNonQuery(
      "INSERT INTO clientes (cnpj, razaosocial) " +
      "VALUES (@cnpj, @razaosocial)", commandParameters);
}

Tipos de Dados

O tipo de dado dos valores dos campos varia de acordo com o tipo do mesmo, conforme mostra a tabela a seguir:

Tipo de Campo Variação Tipo de Dados
NumericTextBox Sem casas decimais System.Int32
Com casas decimais System.Decimal
CheckBox System.Boolean
DateTimePickker System.DateTime
RadioButton System.Int32
Outros System.String

Tratamento de Nulos

O valor dos campos dos tipos “NumericTextBox” e “DateTimePicker” será null quando não forem preenchidos.

Para gravar no banco de dados um valor nulo usando C# você deve usar um valor do tipo Convert.DBNull. Exemplo:

// Monta dicionário com o valor dos parâmetros 
// que serão usados no comando SQL
var commandParameters = new Dictionary<string, object> 
{
   ["@cnpj"]         = rClientes["cnpj"],
   ["@razaosocial"]  = rClientes["razaosocial"] ?? Convert.DBNull  
};
3 curtidas

@daniel.giacomelli.

É possível retornar um Array ou mesmo algum valor utilizando esse tipo de conexão?

Exemplo:

Gostaria de realizar o SELECT em um banco que me retorna uma data, e com essa informação irei fazer um INSERT em outro banco de dados.

Você pode me ajudar com um exemplo?

Segue exemplo @Framos.

O método “ExecuteReader” retorna um objeto do tipo System.Data.Comom.DbDataReader, contendo os dados retornados pelo SELECT.

Cada vez que o método reader.Read() é executado, faz a leitura de uma linha nova e retorna true se tem mais linhas para ler ou senão false.

using LATROMI.Extensions;

// A record será retornada no formato Dictionary<string, object>.
var rClientes = GetRecord('rClientes');

// Abre a conexão 
using (var connection = Database.CreateConnection("DB Clientes"))
{
   // Abre a conexão
   connection.Open();

   // Monta dicionário com o valor dos parâmetros 
   // que serão usados no comando SQL
   var commandParameters = new Dictionary<string, object> 
   {
      ["@cnpj"] = rClientes["cnpj"]
   };
   
   // Executa SELECT os parâmetros do dicionário, retorna um "DbDataReader"
   using(var reader = connection.ExecuteReader(
         "SELECT * FROM clientes WHERE cnpj = @cnpj", commandParameter))
   {
      if (reader.Read())
      {
         // Pega a razão social
         string razaoSocial = (string)reader["razaosocial"];
      }
   }
}

Você também pode dar uma olhada neste outro tópico, onde o DbDataReader também é utilizado:


Edições

  • Adicionado em 2022-08-29T03:00:00Z a linha connection.Open(); para abrir a conexão.
1 curtida

Boa tarde @daniel.giacomelli

Poderia me ajudar a localizar o erro no meu código, infelizmente não estou conseguindo realizar o SELECT

image

using LATROMI.Extensions;
// Abre a conexão 
using (var connection = Database.CreateConnection("BancoCielFwProd_B5"))
{

   using(var reader = connection.ExecuteReader("SELECT carga FROM romaneio WHERE carga = '0094747754';"))
   {
      if (reader.Read())
      {
         string carga = (string)reader["carga"];
      }
   }

}

Olá @Framos!

Tente adicionar connection.Open(); antes de chamar o método ExecuteReader('...').

1 curtida