Definir em RumTime ou passar como parâmetro o Caminho do Banco em DataSnap / DbxReader / DBX4

O Título é este mesmo : “Definir em RumTime ou passar como parâmetro o Caminho do Banco em DataSnap / DbxReader / DBX4” . Nosso objetivo , nossa tecnologia e nosso Framework .

Antes da sequência , comento que tento colocar no título o máximo de informações . È constrangedor e pouco frustrante ( “muito” seria mais adequado ) uma busca no google   e o que poderia ser um solução não se enquadrar no que se necessita ( outra Linguagem , outra tecnologia , outro Framework etc… ) . desta forma , apesar do título pouco gentil evito tempo para alguns e consumo paciência dos que prosseguem .

Para os que prosseguem , principalmente os que utilizam do DbExpress há esta altura cada um tem um modo de sugerir um caminho para que a servidor de Aplicação possa se comunicar a base de Dados . seja através de um arquivo Ini , seja através do Params , seja através do Params.LoadFromFile do LoadParamsFromIniFile ou mesmo utilizando um conexão Registrada na IDE do Delphi com a Propriedade LoadParamsOnConnect cetada em True  . Falando nisso para os que prosseguem e ainda tem uma indefinição abordo uma dessas visões neste Link : https://marcosalles.wordpress.com/2011/02/10/configurar-os-parametro-na-conexao-database-arquivo-ini-dbexpress/

Destaco que no título coloquei , enfatizei o DbxReader e passei grande parte comentando o modo RAD do Delphi , quando utilizamos o SqlConnection que encapsula todo o Framework DbxExpress . A razão disso é simples , apenas um comparativo para mostrar o volumoso vasto e intenso aporte que o Delphi dispensa neste sentido , mas é o DBXReader ?? Tem o LoadFromFile ou LoadParamsFromIniFile ? Se tiver esta um pouco escondido . Atê o momento desconheço e a grande a maioria documentação em formato de Artigos que nos auxilia na familiarização da tecnologia , recomenda que devemos ter um Classe de conexão Registrada Na IDE ( Data Explorer ) do Delphi …  Por cargas horas , uma Classe de conexão requer um caminho Fisíco a uma base de Dados e nos engessa a utilizar o DbxReader de  e nem pensar quando o Driver for registrado em RumTime , ai uma só palavra : ” Ferrou….”

Vamos olhar uma definção genérica da utilização do Framework , quando nos precisamos de instanciar uma Conexão

function TDBXConnectionFactory.GetConnection(
const ConnectionName: UnicodeString;
const UserName: UnicodeString;
const Password: UnicodeString): TDBXConnection;
begin
Result := GetConnection(FDBXContext, ConnectionName, userName, Password);
end;

Para recordar utilizamos assim

var
FConnetion:TDBXConnection;
...
begin
//Fconnetion:=TDBXConnectionFactory.GetConnectionFactory.GetConnection('EMPLOYEE_2_1_FDB','SYSDBA','masterkey');
  • O Primeiro parâmetro é uma Conexão Registradadna IDE do Delphi ( Data Exporer ) , no meu caso ela se chama EMPLOYEE_2_1_FDB e defini um caminho Físico a Base de Dados
  • O Segundo e terceiro parâmetro são User e Senha e dispensa comentários

Este modo é o Padrão de utilizar o Framework para instanciar um Objeto TDBXConnection e posteriormente ser consumido pelas demais classes .. Ai a pergunta , e se necessitarmos de conexão com dez Base de Dados (Firebird) ? Ai a reposta , registramos dez classes de conexões na IDE do Delphi … Hummmmm . Mas se a Base de Dados mudar o caminho Físico ? Como o DbxConnections.ini é um arquivo editãvel , alteramos o caminho correto ? Acredito que funciona , mas ninguém quer assim , ninguém gosta assim , ninguém merece assim … Ninguém sou eu , ninguém é vc , ninguém são todos nos , ninguém é quem prosseguiu com a leitura atê agora . Para esses ninguém vamos utilizar a versão sobrecarregada do método

function GetConnection(ConnectionProperties : TDBXProperties) : TDBXConnection; overload;
  • Onde só temos que passar o parâmetro ConnectionProperties e o retorno será um objeto instanciado TDBXConnection . O parâmetro passado que conterá o caminho físico da base de dados .. assim se tivermos Dez Banco de dados (Firebird) é so configurar o parâmetro com o endereço Físico do Banco de Dados que se quer acessar  .
  • Destaco aqui  o Firebird , mas podemos utilizar qualquer Drive suportado e registrado pelo DBX4 e tb temos a opção de definir Driver em rumTime ( outro artigo futuro)

Mãos a massa …….

const
 dataBase_um = 'Caminho fisico da Base Um';
 dataBase_Dois = 'Caminho fisico da Base Dois';
var
FConnetion:TDBXConnection;
Fcommand:TDBXCommand;
Leitor:TDbxReader;
Props :TDBXProperties ;
begin
props:= TDBXConnectionFactory.GetConnectionFactory.GetDriverProperties('Firebird');
//Acessando a Base Um
props.Properties.Values['DataBase']:=database_um;
Fconnetion:=TDBXConnectionFactory.GetConnectionFactory.GetConnection(props);
//consumo a conexão e depois libero
//Acessando a Base Dois
props.Properties.Values['DataBase']:=database_Dois;
Fconnetion:=TDBXConnectionFactory.GetConnectionFactory.GetConnection(props);
//consumo a conexão e depois libero

Alguns Adendos

  • Neste exemplo fictício  alternei entre as base na mesma rotina . Claro que na realidade isto não tem muito sentido , mas só para demonstrar isto ser possível
  • Utilizei uma constante , mas o caminho Físico da base pose ser passado com parâmetro pelo Cliente do servidor de Aplicação
  • Utilizei o Driver Firebird , mas pode ser utilizado qualquer Driver atê mesmo os registrados em RumTime utilizando o método TDBXDriverRegistry.RegisterDriverClass
  • Enfim as possibilidades são muitas

Quero agradecer a paciência , e deixar registrado que se alguém necessitar do download do artigo , pode entrar em contato. Se precisar de algum outro tipo de dúvida entre na secção Contatos para que possamos estudar caso a caso. Se precisar de Suporte prestamos consultoria … Para aqueles que prosseguiram meu muitissímo obrigado , para aqueles que partiram eu agradeço tb.

[]sds e um forte abraço

ps) antes que eu me esqueça neste mesmo blog tem uma seríe de artigos sobre o tema

https://marcosalles.wordpress.com/?s=DbXreader

Sobre marcosalles

Delphiano de Coração Desenvolvo FreeLancer e presto Consultoria Orientação Online DataSnap DbX ClientDataSet , POO , Padrões de Projeto e dúvidas de Delphi em Geral
Esse post foi publicado em Avisos e marcado , , , , , , , , , . Guardar link permanente.

8 respostas para Definir em RumTime ou passar como parâmetro o Caminho do Banco em DataSnap / DbxReader / DBX4

  1. Wanderley Macedo disse:

    Parabéns mais uma vez e obrigado, isto resolve uma das duvidas que eu tinha.

    Grato,

  2. marcosalles disse:

    Opa Macedo , agradeço o feedback dado por vc . São essas trocas que nos impulsionan na melhora de nosso código e fortaleçe nosso trabalho . Muito Obrigado , um grande abraço

  3. Eduardo Belo disse:

    Excelente Artigo Marco, parabéns!

  4. Perivaldo MARTINS disse:

    Olá Marco Salles, realmente é muito interessante, já haiva olhado algo sobre o DbxReader com Adreano Lanusse, mas não uma abordagem assim, está mesmo muito interessante, você está de parabéns.

    • marcosalles disse:

      Bem vindo Martins e muito obrigado pela participação ..Sinta-se à vontade é que esta seja a primeira de muitas críticas que posteriormente virão . Assim são meus sinceros votos . Muito Obrigado mesmo ; []sds e um grande abraço

  5. arturindio disse:

    Queria tirar uma duvida, no caso da distribuição do software cliente, no meu caso eu uso o MySQL como servidor, ai em Con := TDBXConnectionFactory.GetConnectionFactory.GetConnection(‘DB’, ‘root’, ‘root’);, sempre dá “Argumento Invalido: DB”, como deve ser a configuração em um pc cliente?

    • arturindio disse:

      Olá Marcos, eu consegui seguindo suas dicas. Tenho uma pergunta, é possível carregar as propriedades a partir de um arquivo INI? Tipo:

      props:= TDBXConnectionFactory.GetConnectionFactory.GetDriverPropertiesFromIni(‘config.ini’);

Deixe um comentário