Configurando conexão DBExpress carregando dados de um arquivo INI

Uso essa classe em quase todos os meus projetos que são desenvolvidos em Delphi e necessitam de conexão com banco de dados, a prática de utilizar aquivos INI para carregar dados de configuração é extremamente valiosa, pois da mais flexibilidade ao sistema principalmente quando trabalhamos em rede. Se necessário alterar dados como host, senha, usuário e etc., basta alterar o arquivo INI sem a necessidade de recompilar todo o sistema para efetivar a alteração.
Essa classe tem como objetivo apenas carregar os dados do arquivo INI cujo o caminho é passado como parâmetro e setar as devidas configurações no componente SQLConnection que também é passado como parâmetro mas como valor de referência, ou seja, estamos trabalhando direto no objeto e não em sua cópia.
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 |
unit UConexao; interface uses IniFiles, SysUtils, Forms, SqlExpr, Dialogs; type TConexao = class private Path: string; Secao: string; Host: string; Porta: integer; Database: string; Password: string; User: string; VendorLib: string; LibraryC: string; GetDriver: string; Driver: string; Connection: string; Charset: string; public constructor Create(Path: string; Secao: string); procedure LeINI(); virtual; procedure GravaINI(Usuario, Senha, Servidor, Banco: string); virtual; procedure Conectar(var Conexao: TSQLConnection); virtual; property Hostname: string read Host; property Usuario: string read User; property Senha: string read Password; property Banco: string read Database; end; implementation procedure TConexao.Conectar(var Conexao: TSQLConnection); begin //Le o arquivo INI e carrega os valores nas respectivas variáveis LeINI(); try //Passa os parâmetros para o objeto Conexão Conexao.Connected := false; Conexao.LoginPrompt := false; Conexao.ParamsLoaded := True; Conexao.DriverName := Driver; Conexao.GetDriverFunc := GetDriver; Conexao.LibraryName := LibraryC; Conexao.VendorLib := VendorLib; Conexao.Params.Clear; Conexao.Params.Add('servercharset='+ Charset); Conexao.Params.Add('hostname='+ Host); Conexao.Params.Add('user_name='+ User); Conexao.Params.Add('password='+ Password); Conexao.Params.Add('port='+ IntToStr(Porta)); Conexao.Params.Add('Database='+ Database); Except on E:Exception do ShowMessage('Erro ao carregar parâmetros de conexão!'#13#10 + E.Message); end; end; constructor TConexao.Create(Path: string; Secao: string); begin // Verifica se o arquivo INI existe 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; procedure TConexao.LeINI(); var ArqIni : TIniFile; begin ArqIni := TIniFile.Create(Path); try //Carrega valores para conexão com banco de dados Host := ArqIni.ReadString(Secao, 'Hostname', ''); Porta := ArqIni.ReadInteger(Secao, 'Port', ); Database := ArqIni.ReadString(Secao, 'Database', ''); Password := ArqIni.ReadString(Secao, 'Password', ''); User := ArqIni.ReadString(Secao, 'user_name', ''); VendorLib := ArqIni.ReadString(Secao, 'VendorLib', ''); LibraryC := ArqIni.ReadString(Secao, 'LibraryName', ''); GetDriver := ArqIni.ReadString(Secao, 'GetDriveFunc', ''); Driver := ArqIni.ReadString(Secao, 'drivername', ''); Charset := ArqIni.ReadString(Secao, 'charset', ''); Connection := ArqIni.ReadString(Secao, 'ConnectionName', ''); finally ArqIni.Free; end; end; end. |
Vamos aos detalhes:
Observação: Colega Marco Salles profundo conhecedor em Delphi me sugeriu uma pequena citação, a propriedade LoadParamsOnConnect do componente SQLConnection precisa estar setada como FALSE, para que a leitura dos parâmetros funcione.
Abaixo um exemplo do arquivo INI, simulando uma conexão com o banco de dados db_blog, observem o nome da seção “[Conexao_MySQL]“:
String_Conexao.ini
1 2 3 4 5 6 7 8 9 10 11 |
[Conexao_MySQL] Hostname=localhost Port=3306 Database=db_blog Password=0123456 user_name=root drivername=MySQL charset=utf8 LibraryName=dbxmys.dll VendorLib=LIBMYSQL.dll GetDriveFunc=getSQLDriverMYSQL |
Nesse artigo construí uma pequena aplicação com apenas um formulário e nele adicionei um TSQLConnection, um botão e um label para exibir o status da conexão. No evento OnClik do botão chamo uma conexão ou desconecto do banco usando o operador lógico NOT. No evento BeforeConnect é instanciado o objeto passando como parâmetro o caminho do arquivo INI que está no mesmo diretório do executável. Segue abaixo o código desse formulário:
frmConexao.pas
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 |
unit UFrmConexao; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, SqlExpr, StdCtrls, Buttons, UConexao, DBXMySQL; type TfrmConexao = class(TForm) Conexao: TSQLConnection; btnConectar: TBitBtn; lblStatus: TLabel; procedure FormCreate(Sender: TObject); procedure btnConectarClick(Sender: TObject); procedure ConexaoBeforeConnect(Sender: TObject); private procedure VerificaConexao(); public { Public declarations } end; var frmConexao: TfrmConexao; conn: TConexao; implementation {$R *.dfm} { TForm1 } procedure TfrmConexao.btnConectarClick(Sender: TObject); begin Conexao.Connected := not Conexao.Connected; Self.VerificaConexao; end; procedure TfrmConexao.ConexaoBeforeConnect(Sender: TObject); begin try conn := TConexao.Create(ExtractFilePath(Application.ExeName) + 'String_Conexao.ini', 'Conexao_MySQL'); conn.Conectar(Conexao); except on E:Exception do begin ShowMessage('Erro ao iniciar conexão!'#13 + E.Message); Application.Terminate; end; end; end; procedure TfrmConexao.FormCreate(Sender: TObject); begin Self.VerificaConexao; end; procedure TfrmConexao.VerificaConexao; begin if Conexao.Connected = true then begin btnConectar.Caption := 'Desconectar'; lblStatus.Caption := 'Conectado!'; lblStatus.Font.Color := clGreen; end else begin btnConectar.Caption := 'Conectar'; lblStatus.Caption := 'Desconectado!'; lblStatus.Font.Color := clRed; end; end; end. |
Ao clicar no botão Conectar o label é atualizado para ‘Conectado!’ e o botão habilitado para desconectar: