Conexão FireDAC + Firebird com arquivo INI no Delphi XE6
Pessoal o tema de hoje é como configurar uma conexão FireDAC com o SGBD Firebird no Delphi XE6, mas nesse post vamos construir uma aplicação que vai gravar e ler os parâmetros de configuração a partir de um arquivo INI.
Não é segredo para os leitores que acompanham meu blog o quanto gosto de desenvolver em Delphi, só não desenvolvo mais por falta de tempo e porque o desenvolvimento para plataforma WEB ocupa boa parte do meu tempo, mas ainda tenho alguns projetos interessantes escritos em Delphi.
Lembrando que a Engine FireDAC se tornou recomendação oficial da Embarcadero a partir do Delphi XE7, deixando para trás a famosa engine DBExpress.
Outros post sobre Delphi que podem interessar:
Configurando conexão DBExpress carregando dados de um arquivo INI
Cliente FTP com Delphi XE6 | Vídeo
Fim do suporte a Engine BDE no Delphi XE7 preocupa!
Construindo Formulário
Nossa aplicação terá apenas um formulário, onde vamos informar os parâmetros de configuração nos devidos campos, gravar esses parâmetros em um arquivo INI e posteriormente poderemos testar a conexão FireDAC com o banco de dados Firebird informado os parâmetros. Construí uma classe “TConexao” para trabalhar com arquivos INI (Leitura e Escrita) e também carregar parâmetros de conexão no componente FireDAC, no decorrer do post ela será exibida. Abaixo o layout do formulário:
Só vou destacar os 3 componentes FireDAC que tem relação com a conexão, para o leitor que tem interesse em conhecer mais sobre os componentes FireDAC deixo o link para documentação oficial da Embarcadero:
- TFDConnection (Componente responsável por estabelecer uma conexão com o banco de dados)
- TFDGUIxWaitCursor (Componente que permite controlar o cursor de espera, obrigatório para aplicações que usam FireDAC)
- TFDPhysFBDriverLink (Componente para conectar o driver Firebird com aplicação)
Observem que os campos tem relação com propriedades do componente TFDConnection e devem possuir informações relativas a conexão, no campo “Banco de Dados” com o auxílio do componente TOpenTextFileDialog podemos selecionar o arquivo .FDB do nosso banco de dados Firebird.
Após preencher todos os dados é só pressionar o botão “Gravar” para criar ou atualizar o arquivo INI. Com as informações gravadas podemos testar a conexão FireDAC pressionando o botão “CONECTAR”.
Codificando os eventos
Abaixo segue a codificação dos eventos OnClick dos botões, OnCreate do formulário e BeforeConnect do componente TFDConnection. Observem que os parâmetros de conexão vem dos atributos que estão na classe TConexao, no método construtor dessa classe passo o caminho e nome do arquivo INI (nesse exemplo o nome é Config.ini) e nome da seção que vamos ler, esse método é chamado no evento OnCreate do formulário assim podemos carregar os parâmetros nos Edts caso o arquivo INI já tenha sido criado.
Outro ponto chave, observem que chamei o método “Conectar” no evento BeforeConnect do componente TFDConnection, ou seja, sempre que abrimos uma conexão esse evento é disparado antes e dessa forma carregamos os parâmetros e depois iniciamos a conexão.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
var frmPrincipal: TfrmPrincipal; conexaoClass : TConexao; implementation {$R *.dfm} // Carrega as informações do arquivo INI nos campos procedure TfrmPrincipal.FormCreate(Sender: TObject); begin conexaoClass := TConexao.Create(ExtractFilePath(Application.ExeName) + 'Config.ini', 'Conexao'); conexaoClass.LeINI; edtBancoDados.Text := conexaoClass.Database; edtServidor.Text := conexaoClass.Servidor; edtPorta.Text := IntToStr(conexaoClass.Porta); edtUsuario.Text := conexaoClass.Usuario; edtSenha.Text := conexaoClass.Senha; end; // Abre o Dialog para informar o caminho e nome do arquivo .FDB procedure TfrmPrincipal.btnProcuraBancoClick(Sender: TObject); begin if OpenTextFileDialog.Execute then begin edtBancoDados.Text := OpenTextFileDialog.FileName; end; end; // Grava no arquivo INI as informações dos Edits procedure TfrmPrincipal.btnGravarClick(Sender: TObject); begin conexaoClass.GravaINI(edtUsuario.Text, edtSenha.Text, edtServidor.Text, edtBancoDados.Text, StrToInt(edtPorta.Text)); MessageDlg('Gravado com sucesso!', mtConfirmation, [mbOK], ); end; // Chama o método conectar da classe para carregar os parâmetros do INI procedure TfrmPrincipal.FDConnectionBeforeConnect(Sender: TObject); begin conexaoClass.Conectar(FDConnection); end; // Conecta ou Desconecta do banco conforme o status procedure TfrmPrincipal.btnConexaoClick(Sender: TObject); begin if not FDConnection.Connected then begin FDConnection.Connected := True; btnConexao.Font.Color := clRed; btnConexao.Caption := 'Desconectar'; end else begin FDConnection.Connected := false; btnConexao.Font.Color := clGreen; btnConexao.Caption := 'Conectar'; end; end; |
Classe para manipulação do arquivo INI e parâmetros de conexão
Minha classe “TConexao” para ler e gravar informações em arquivos INI, sempre usei essa classe com DBExpress mas com poucas adaptações ela funcionou muito bem com FireDAC.
Essa classe também possui um método Conectar que recebe como parâmetro um valor de referência para um objeto do tipo TFDConnection (componente de conexão FireDAC). Como esse parâmetro é passado por referência basta carregar as propriedades de conexão e abrir a conexão para que nossa aplicação já esteja conectada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
unit UConexao; interface uses IniFiles, SysUtils, Forms, FireDAC.Comp.Client, Dialogs; type TConexao = class private FPath: string; FServidor: string; FPorta: integer; FDatabase: string; FSenha: string; FUsuario: string; FDriver: string; FSecao: string; public property Path : string read FPath write FPath; property Servidor : string read FServidor write FServidor; property Porta : integer read FPorta write FPorta; property Database : string read FDatabase write FDatabase; property Senha : string read FSenha write FSenha; property Usuario : string read FUsuario write FUsuario; property Driver : string read FDriver write FDriver; property Secao : string read FSecao write FSecao; constructor Create(Path: string; Secao: string); procedure LeINI(); virtual; procedure GravaINI(Usuario, Senha, Servidor, Banco: string; Porta: integer); virtual; procedure Conectar(var Conexao: TFDConnection); virtual; end; implementation // Lê o arquivo INI e carrega os parâmetros no componente TFDConnection procedure TConexao.Conectar(var Conexao: TFDConnection); begin LeINI(); try //Passa os parâmetros para o objeto Conexão Conexao.Connected := false; Conexao.LoginPrompt := false; Conexao.Params.Clear; Conexao.Params.Add('hostname='+ Servidor); Conexao.Params.Add('user_name='+ Usuario); Conexao.Params.Add('password='+ Senha); Conexao.Params.Add('port='+ IntToStr(Porta)); Conexao.Params.Add('Database='+ Database); Conexao.Params.Add('DriverID='+ Driver); Except on E:Exception do ShowMessage('Erro ao carregar parâmetros de conexão!'#13#10 + E.Message); end; end; // Método construtor recebe o caminho do INI e nome da Seção para Leitura constructor TConexao.Create(Path: string; Secao: string); begin if FileExists(Path) then begin Self.Path := Path; Self.Secao := Secao; end else raise Exception.Create('Arquivo INI para configuração não encontrado.'#13#10'Aplicação será finalizada.'); end; // Grava os parâmetros recebidos no arquivo INI procedure TConexao.GravaINI(Usuario, Senha, Servidor, Banco: string; Porta: integer); var ArqIni : TIniFile; begin ArqIni := TIniFile.Create(Path); try ArqIni.WriteString(Secao, 'Usuario', Usuario); ArqIni.WriteString(Secao, 'Senha', Senha); ArqIni.WriteString(Secao, 'Database', Banco); ArqIni.WriteString(Secao, 'Servidor', Servidor); ArqIni.WriteInteger(Secao, 'Porta', Porta); finally ArqIni.Free; end; end; // Lê os parâmetros do arquivo INI e atribui para os atributos procedure TConexao.LeINI(); var ArqIni : TIniFile; begin ArqIni := TIniFile.Create(Path); try Servidor := ArqIni.ReadString(Secao, 'Servidor', ''); Porta := ArqIni.ReadInteger(Secao, 'Porta', ); Database := ArqIni.ReadString(Secao, 'Database', ''); Senha := ArqIni.ReadString(Secao, 'Senha', ''); Usuario := ArqIni.ReadString(Secao, 'Usuario', ''); Driver := ArqIni.ReadString(Secao, 'drivername', ''); finally ArqIni.Free; end; end; end. |
Testando conexão FireDAC com Firebird
Estrutura do arquivo INI “Config.ini” após serem gravadas as informações:
Observem que quando o botão estiver na cor verde significa que ainda não estamos conectados ao banco de dados, basta pressionar o botão “CONECTAR” abrir a conexão.
Quando o botão estiver na cor vermelha significa que estamos conectados ao banco de dados, basta pressionar o botão “DESCONECTAR” para fechar a conexão.
Observação: O componente TFDPhysFBDriverLink possui uma propriedade “VendorLib” onde devemos informar o caminho para DLL fbcliente.dll, mas no meu caso essa DLL já está dentro da pasta C:\Windows\System32 então não foi necessário passar esse parâmetro.
Bom pessoal nesse post demonstrei como podemos gravar e ler informações de um arquivo INI e também como carregar essas informações para configurar uma conexão FireDAC com o banco de dados Firebird. É claro que quando desenvolvemos nossos sistemas não existe a necessidade de ter um formulário para gravar essas informações, precisamos apenas ler os parâmetros e carregar no componente mas resolvi montar um exemplo mais completo.
Até a próxima…