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
Parabéns mais uma vez e obrigado, isto resolve uma das duvidas que eu tinha.
Grato,
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
Excelente Artigo Marco, parabéns!
Obrigado amigo por sua leitura e acima de tudo seu incentivo .. []sds e muito Obrigado
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.
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
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?
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’);