Como conectar Delphi ao MySQL usando FireDAC e arquivo INI

Se você desenvolve aplicações em Delphi que utilizam banco de dados, uma das necessidades mais comuns é estabelecer uma conexão segura, organizada e fácil de configurar com o MySQL.

Neste artigo, vamos aprender uma forma profissional de fazer essa conexão utilizando o FireDAC, framework de acesso a dados disponível no Delphi, e um arquivo INI para armazenar as configurações do banco de dados.

A grande vantagem dessa abordagem é que informações como servidor, porta, banco de dados, usuário e outras configurações não precisam ficar gravadas diretamente no código-fonte.

A estrutura que vamos construir pode ser utilizada como base para sistemas comerciais, aplicações administrativas, sistemas ERP, PDV, sistemas web desktop e outros projetos desenvolvidos em Delphi.


O que vamos utilizar

Neste exemplo utilizaremos:

  • Delphi
  • FireDAC
  • MySQL
  • Arquivo .ini
  • TIniFile
  • TFDConnection
  • TFDQuery
  • TDataSource
  • TDBGrid

O exemplo pode ser adaptado para aplicações VCL e, com os devidos ajustes, para outros tipos de projeto Delphi.


1. Por que utilizar um arquivo INI?

Uma abordagem muito comum, principalmente em projetos iniciantes, é colocar a configuração diretamente no código:

FDConnection1.Params.Clear;
FDConnection1.Params.Add('DriverID=MySQL');
FDConnection1.Params.Add('Server=localhost');
FDConnection1.Params.Add('Port=3306');
FDConnection1.Params.Add('Database=meubanco');
FDConnection1.Params.Add('User_Name=root');
FDConnection1.Params.Add('Password=123456');

Funciona?

Sim.

Mas não é uma boa arquitetura para um sistema que será distribuído ou instalado em diferentes computadores.

Imagine que você tenha um sistema instalado em 50 empresas.

Cada cliente poderá utilizar:

  • servidor diferente;
  • banco diferente;
  • porta diferente;
  • usuário diferente;
  • senha diferente;
  • ambiente de produção ou homologação.

Alterar essas informações diretamente no código significa precisar recompilar ou alterar o executável.

Uma alternativa muito mais organizada é colocar as configurações em um arquivo:

config.ini

Por exemplo:

[DATABASE]
DriverID=MySQL
Server=localhost
Port=3306
Database=meubanco
User_Name=root
Password=minhasenha
CharacterSet=utf8mb4

Assim, o executável permanece o mesmo e as configurações podem ser alteradas externamente.


2. Estrutura do projeto

Uma estrutura simples pode ser:

MeuSistema/
│
├── MeuSistema.exe
├── config.ini
└── libmysql.dll

Em projetos maiores, podemos evoluir essa estrutura:

MeuSistema/
│
├── MeuSistema.exe
│
├── config/
│   └── config.ini
│
├── database/
│
├── reports/
│
└── lib/

Para um sistema comercial, entretanto, é importante considerar também permissões do sistema operacional, atualização da biblioteca do MySQL e proteção das credenciais.


3. O FireDAC

O FireDAC é a tecnologia de acesso a dados utilizada neste exemplo.

Para trabalhar com MySQL, utilizaremos principalmente:

TFDConnection

O TFDConnection será responsável por estabelecer a conexão com o banco.

Para executar comandos SQL, utilizaremos:

TFDQuery

E para disponibilizar os dados para componentes visuais:

TDataSource

Uma estrutura comum fica assim:

TFDConnection
       │
       ▼
   TFDQuery
       │
       ▼
  TDataSource
       │
       ▼
    TDBGrid

4. Componentes no formulário

Crie um novo projeto VCL Forms Application.

No formulário, adicione:

TFDConnection
TFDQuery
TDataSource
TDBGrid
TButton

Podemos nomeá-los:

FDConnection1
FDQuery1
DataSource1
DBGrid1
btnConsultar

Configure:

FDQuery1.Connection = FDConnection1

DataSource1.DataSet = FDQuery1

DBGrid1.DataSource = DataSource1

5. Unidades necessárias

No uses da unit, utilizaremos:

uses
  System.SysUtils,
  System.Classes,
  System.IniFiles,
  FireDAC.Comp.Client,
  FireDAC.Stan.Def,
  FireDAC.Stan.Intf,
  FireDAC.Stan.Option,
  FireDAC.Stan.Param,
  FireDAC.Phys,
  FireDAC.Phys.MySQL,
  FireDAC.Phys.MySQLDef;

Dependendo da versão do Delphi e da estrutura do projeto, outras units do FireDAC podem ser adicionadas automaticamente pelo IDE.


6. Criando o arquivo config.ini

Na mesma pasta do executável, crie:

config.ini

Coloque:

[DATABASE]
DriverID=MySQL
Server=localhost
Port=3306
Database=meubanco
User_Name=root
Password=123456
CharacterSet=utf8mb4

Obviamente, substitua os valores pelos dados reais do seu servidor MySQL.

Por exemplo:

[DATABASE]
DriverID=MySQL
Server=192.168.1.100
Port=3306
Database=sistema
User_Name=app_user
Password=MinhaSenha
CharacterSet=utf8mb4

7. Localizando o arquivo INI

Uma boa prática é não depender do diretório atual do Windows.

Utilize o diretório onde o executável está localizado:

ExtractFilePath(ParamStr(0))

Podemos montar o caminho do arquivo assim:

var
  ArquivoINI: string;

begin
  ArquivoINI := IncludeTrailingPathDelimiter(
    ExtractFilePath(ParamStr(0))
  ) + 'config.ini';
end;

Isso fará com que o Delphi procure o arquivo no mesmo diretório do executável.


8. Criando a função de conexão

Agora vamos criar uma função responsável por ler o arquivo INI e configurar o FireDAC.

function TForm1.ConectarBanco: Boolean;
var
  Ini: TIniFile;
  ArquivoINI: string;
begin
  Result := False;

  ArquivoINI := IncludeTrailingPathDelimiter(
    ExtractFilePath(ParamStr(0))
  ) + 'config.ini';

  if not FileExists(ArquivoINI) then
    raise Exception.Create(
      'Arquivo de configuração não encontrado:' +
      sLineBreak +
      ArquivoINI
    );

  Ini := TIniFile.Create(ArquivoINI);
  try
    FDConnection1.Close;
    FDConnection1.Params.Clear;

    FDConnection1.DriverName :=
      Ini.ReadString('DATABASE', 'DriverID', 'MySQL');

    FDConnection1.Params.Values['Server'] :=
      Ini.ReadString('DATABASE', 'Server', 'localhost');

    FDConnection1.Params.Values['Port'] :=
      Ini.ReadString('DATABASE', 'Port', '3306');

    FDConnection1.Params.Values['Database'] :=
      Ini.ReadString('DATABASE', 'Database', '');

    FDConnection1.Params.Values['User_Name'] :=
      Ini.ReadString('DATABASE', 'User_Name', '');

    FDConnection1.Params.Values['Password'] :=
      Ini.ReadString('DATABASE', 'Password', '');

    FDConnection1.Params.Values['CharacterSet'] :=
      Ini.ReadString('DATABASE', 'CharacterSet', 'utf8mb4');

    FDConnection1.LoginPrompt := False;

    FDConnection1.Connected := True;

    Result := FDConnection1.Connected;

  finally
    Ini.Free;
  end;
end;

Essa função centraliza a configuração da conexão.


9. Chamando a conexão

Podemos conectar ao banco quando o formulário for criado:

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
    ConectarBanco;

    ShowMessage('Conexão realizada com sucesso.');

  except
    on E: Exception do
      ShowMessage(
        'Erro ao conectar ao banco de dados:' +
        sLineBreak +
        E.Message
      );
  end;
end;

Uma alternativa mais profissional é não mostrar ShowMessage durante o funcionamento normal do sistema e utilizar uma rotina de tratamento de erros ou uma tela própria.


10. Criando uma função de conexão mais reutilizável

Em sistemas maiores, não recomendo colocar toda a lógica de banco dentro do formulário principal.

Podemos criar uma unit:

uDatabase.pas

E centralizar nela o acesso ao banco.

Por exemplo:

unit uDatabase;

interface

uses
  System.SysUtils,
  System.Classes,
  System.IniFiles,
  FireDAC.Comp.Client,
  FireDAC.Phys.MySQL,
  FireDAC.Phys.MySQLDef;

function CriarConexao: TFDConnection;

implementation

function CriarConexao: TFDConnection;
var
  Ini: TIniFile;
  ArquivoINI: string;
begin
  Result := TFDConnection.Create(nil);

  ArquivoINI := IncludeTrailingPathDelimiter(
    ExtractFilePath(ParamStr(0))
  ) + 'config.ini';

  if not FileExists(ArquivoINI) then
    raise Exception.Create(
      'Arquivo config.ini não encontrado.'
    );

  Ini := TIniFile.Create(ArquivoINI);
  try

    Result.LoginPrompt := False;

    Result.DriverName :=
      Ini.ReadString('DATABASE', 'DriverID', 'MySQL');

    Result.Params.Values['Server'] :=
      Ini.ReadString('DATABASE', 'Server', 'localhost');

    Result.Params.Values['Port'] :=
      Ini.ReadString('DATABASE', 'Port', '3306');

    Result.Params.Values['Database'] :=
      Ini.ReadString('DATABASE', 'Database', '');

    Result.Params.Values['User_Name'] :=
      Ini.ReadString('DATABASE', 'User_Name', '');

    Result.Params.Values['Password'] :=
      Ini.ReadString('DATABASE', 'Password', '');

    Result.Params.Values['CharacterSet'] :=
      Ini.ReadString('DATABASE', 'CharacterSet', 'utf8mb4');

  finally
    Ini.Free;
  end;
end;

end.

Depois:

FDConnection1 := CriarConexao;
FDConnection1.Connected := True;

Essa abordagem facilita bastante a manutenção.


11. Uma arquitetura ainda melhor

Para sistemas maiores, podemos criar uma classe específica para gerenciar a conexão:

Projeto
│
├── Data
│   ├── uDatabase.pas
│   ├── uConnection.pas
│   └── uQueryHelper.pas
│
├── Models
│
├── Services
│
├── Forms
│
└── config.ini

Assim, os formulários não precisam conhecer todos os detalhes de configuração do banco.

Por exemplo:

Database := TDatabase.Create;

E a classe pode ser responsável por:

  • ler o INI;
  • abrir conexão;
  • fechar conexão;
  • testar conexão;
  • executar comandos;
  • tratar erros;
  • configurar transações.

Essa separação é especialmente interessante em sistemas comerciais.


12. Testando a conexão

Depois de estabelecer a conexão, podemos verificar:

if FDConnection1.Connected then
  ShowMessage('Banco conectado!')
else
  ShowMessage('Banco não conectado!');

Entretanto, em aplicações reais, é melhor deixar o próprio Connected := True gerar a exceção quando houver falha e tratar o erro de forma adequada.


13. Executando uma consulta MySQL

Com a conexão funcionando, podemos utilizar:

FDQuery1.Close;

FDQuery1.SQL.Text :=
  'SELECT codigo, nome FROM clientes ORDER BY nome';

FDQuery1.Open;

O resultado poderá ser mostrado no DBGrid.


14. Utilizando parâmetros

Evite montar SQL concatenando diretamente os valores fornecidos pelo usuário.

Evite:

FDQuery1.SQL.Text :=
  'SELECT * FROM clientes WHERE nome = ''' +
  EditNome.Text +
  '''';

Prefira parâmetros:

FDQuery1.Close;

FDQuery1.SQL.Text :=
  'SELECT * FROM clientes ' +
  'WHERE nome LIKE :nome';

FDQuery1.ParamByName('nome').AsString :=
  '%' + EditNome.Text + '%';

FDQuery1.Open;

Além de deixar o código mais organizado, essa abordagem evita uma série de problemas relacionados à montagem manual de SQL.


15. Inserindo dados

Para inserir um cliente:

FDQuery1.Close;

FDQuery1.SQL.Text :=
  'INSERT INTO clientes (nome, telefone) ' +
  'VALUES (:nome, :telefone)';

FDQuery1.ParamByName('nome').AsString :=
  'João da Silva';

FDQuery1.ParamByName('telefone').AsString :=
  '91999999999';

FDQuery1.ExecSQL;

Depois da execução:

ShowMessage('Cliente cadastrado com sucesso.');

16. Utilizando transações

Em operações que envolvem várias alterações no banco, é importante considerar transações.

Exemplo:

FDConnection1.StartTransaction;

try

  FDQuery1.SQL.Text :=
    'INSERT INTO tabela1 (...) VALUES (...)';

  FDQuery1.ExecSQL;

  FDQuery1.SQL.Text :=
    'UPDATE tabela2 SET ...';

  FDQuery1.ExecSQL;

  FDConnection1.Commit;

except
  on E: Exception do
  begin
    FDConnection1.Rollback;
    raise;
  end;
end;

Dessa maneira, caso uma das operações falhe, podemos desfazer as alterações realizadas dentro da transação.


17. Configurando o charset

Para aplicações modernas, principalmente sistemas que trabalham com português e outros idiomas, é importante que o banco esteja configurado adequadamente para Unicode.

No arquivo:

CharacterSet=utf8mb4

No MySQL, também é importante verificar a configuração do banco, tabelas e colunas.

Por exemplo:

CREATE DATABASE sistema
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;

A collation disponível pode variar conforme a versão do MySQL. Portanto, utilize uma configuração compatível com a versão instalada no servidor.


18. Onde colocar o libmysql.dll?

Dependendo da configuração utilizada pelo FireDAC e da versão do MySQL, o driver poderá precisar da biblioteca cliente correspondente.

Um cenário comum é:

MeuSistema.exe
libmysql.dll
config.ini

A DLL deve ser compatível com a arquitetura da aplicação.

Por exemplo:

Aplicação Win32 → DLL compatível com Win32
Aplicação Win64 → DLL compatível com Win64

Esse é um dos pontos que mais causa erro em aplicações Delphi que tentam acessar MySQL.

Uma mensagem relacionada à impossibilidade de carregar a biblioteca do cliente normalmente indica que a DLL necessária não foi encontrada ou não é compatível com a arquitetura/versão esperada.


19. Não coloque o config.ini dentro do código-fonte

Uma das vantagens dessa arquitetura é poder distribuir:

MeuSistema.exe
config.ini

O administrador pode configurar:

[DATABASE]
Server=192.168.0.10
Port=3306
Database=sistema
User_Name=usuario_sistema
Password=senha
CharacterSet=utf8mb4

Sem precisar recompilar o programa.

Isso é especialmente útil quando o mesmo executável será instalado em vários clientes.


20. E a segurança da senha?

Aqui temos uma questão importante.

Um arquivo INI é conveniente, mas não deve ser considerado um mecanismo de proteção de senha.

Se colocarmos:

Password=123456

qualquer pessoa que consiga abrir o arquivo poderá visualizar a senha.

Para aplicações simples e ambientes controlados, isso pode ser aceitável dependendo do cenário.

Para sistemas comerciais mais sensíveis, podemos evoluir a solução.

Algumas alternativas são:

  • criptografar determinadas configurações;
  • utilizar credenciais específicas para a aplicação;
  • limitar permissões do usuário do banco;
  • utilizar um serviço intermediário/API;
  • utilizar variáveis de ambiente;
  • utilizar um gerenciador seguro de credenciais;
  • evitar que o usuário da aplicação tenha privilégios administrativos no MySQL.

21. Nunca utilize root na aplicação em produção

Durante os testes, é comum utilizar:

User_Name=root

Mas não é uma boa prática para um sistema comercial.

Crie um usuário específico para a aplicação.

Por exemplo:

CREATE USER 'app_sistema'@'%' IDENTIFIED BY 'SenhaForteAqui';

Depois conceda somente os privilégios necessários.

Por exemplo:

GRANT SELECT, INSERT, UPDATE, DELETE
ON sistema.*
TO 'app_sistema'@'%';

O conjunto exato de privilégios deve ser definido de acordo com as necessidades da aplicação.

A ideia principal é simples:

A aplicação não precisa ser administradora do banco de dados.


22. Criando um teste de conexão

Podemos criar uma função específica:

function TestarConexao: Boolean;
begin
  Result := False;

  try
    FDConnection1.Connected := False;
    FDConnection1.Connected := True;

    Result := FDConnection1.Connected;

  except
    on E: Exception do
    begin
      Result := False;
      raise Exception.Create(
        'Não foi possível conectar ao MySQL.' +
        sLineBreak +
        sLineBreak +
        E.Message
      );
    end;
  end;
end;

Podemos chamar essa função em uma tela de configuração:

Configuração do Banco de Dados

Servidor:   [192.168.0.10       ]

Porta:      [3306               ]

Banco:      [sistema            ]

Usuário:    [app_sistema        ]

Senha:      [*******************]

             [ TESTAR CONEXÃO ]

Essa é uma solução muito interessante para sistemas que precisam ser instalados por técnicos em diferentes clientes.


23. Criando um INI mais completo

Podemos separar configurações de banco e aplicação:

[DATABASE]
DriverID=MySQL
Server=localhost
Port=3306
Database=sistema
User_Name=app_sistema
Password=senha
CharacterSet=utf8mb4

[APPLICATION]
Empresa=Minha Empresa
Ambiente=PRODUCAO
Log=True

[BACKUP]
Enabled=True
Directory=C:\Backup\Sistema

Isso permite que o arquivo INI se torne o centro das configurações externas da aplicação.


24. Exemplo completo

Uma implementação simples e funcional pode ficar assim:

procedure TForm1.Conectar;
var
  Ini: TIniFile;
  ArquivoINI: string;
begin

  ArquivoINI :=
    IncludeTrailingPathDelimiter(
      ExtractFilePath(ParamStr(0))
    ) + 'config.ini';

  if not FileExists(ArquivoINI) then
    raise Exception.Create(
      'Arquivo config.ini não encontrado.'
    );

  Ini := TIniFile.Create(ArquivoINI);

  try

    FDConnection1.Close;
    FDConnection1.Params.Clear;

    FDConnection1.DriverName :=
      Ini.ReadString(
        'DATABASE',
        'DriverID',
        'MySQL'
      );

    FDConnection1.Params.Values['Server'] :=
      Ini.ReadString(
        'DATABASE',
        'Server',
        'localhost'
      );

    FDConnection1.Params.Values['Port'] :=
      Ini.ReadString(
        'DATABASE',
        'Port',
        '3306'
      );

    FDConnection1.Params.Values['Database'] :=
      Ini.ReadString(
        'DATABASE',
        'Database',
        ''
      );

    FDConnection1.Params.Values['User_Name'] :=
      Ini.ReadString(
        'DATABASE',
        'User_Name',
        ''
      );

    FDConnection1.Params.Values['Password'] :=
      Ini.ReadString(
        'DATABASE',
        'Password',
        ''
      );

    FDConnection1.Params.Values['CharacterSet'] :=
      Ini.ReadString(
        'DATABASE',
        'CharacterSet',
        'utf8mb4'
      );

    FDConnection1.LoginPrompt := False;

    FDConnection1.Connected := True;

  finally
    Ini.Free;
  end;

end;

No FormCreate:

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
    Conectar;
  except
    on E: Exception do
    begin
      ShowMessage(
        'Erro ao conectar ao banco de dados:' +
        sLineBreak +
        E.Message
      );

      Application.Terminate;
    end;
  end;
end;

25. Uma arquitetura profissional para projetos maiores

Se você estiver desenvolvendo um sistema maior, como um ERP, sistema hospitalar, sistema de gestão ou sistema SaaS, vale a pena separar completamente a infraestrutura de banco.

Uma sugestão:

MeuSistema
│
├── Forms
│   ├── frmPrincipal.pas
│   ├── frmClientes.pas
│   └── frmProdutos.pas
│
├── Data
│   ├── uDatabase.pas
│   ├── uConnection.pas
│   └── uQuery.pas
│
├── Models
│   ├── uCliente.pas
│   └── uProduto.pas
│
├── Services
│   ├── uClienteService.pas
│   └── uProdutoService.pas
│
├── Utils
│
└── config.ini

A principal vantagem é evitar que cada formulário tenha sua própria lógica de conexão.


26. Uma dica importante: uma conexão centralizada

Em muitos sistemas Delphi, não é necessário criar uma conexão independente em cada formulário.

Uma abordagem comum é manter uma conexão centralizada.

Por exemplo:

DataModule
     │
     ├── FDConnection
     │
     ├── FDQuery
     │
     └── DataSource

Podemos criar:

dmDatabase.pas

com:

TFDConnection

E os demais módulos utilizam essa conexão.

Isso facilita:

  • gerenciamento da conexão;
  • transações;
  • configurações;
  • manutenção;
  • tratamento de erros;
  • troca de ambiente.

27. Configuração de desenvolvimento e produção

Outra evolução interessante é utilizar ambientes diferentes.

Por exemplo:

[DATABASE]
Server=localhost
Port=3306
Database=sistema_dev
User_Name=app_dev
Password=senha_dev

No ambiente de produção:

[DATABASE]
Server=10.0.0.10
Port=3306
Database=sistema
User_Name=app_sistema
Password=senha_producao

O executável pode permanecer o mesmo.

Somente o arquivo de configuração muda.

Isso é particularmente útil para equipes de desenvolvimento.


28. Erros comuns ao conectar Delphi ao MySQL

"Can't load libmysql.dll"

Normalmente está relacionado à biblioteca cliente do MySQL não estar disponível ou ser incompatível com a aplicação.

Verifique:

  • arquitetura Win32/Win64;
  • localização da DLL;
  • versão da biblioteca;
  • dependências da DLL;
  • configuração do driver.

"Access denied for user"

Normalmente indica problema com:

  • usuário;
  • senha;
  • host autorizado;
  • privilégios;
  • configuração do usuário no MySQL.

Verifique as permissões do usuário.


"Unknown database"

Significa que o banco informado no arquivo INI não existe ou não está acessível.

Confira:

Database=sistema

E verifique no MySQL:

SHOW DATABASES;

"Can't connect to MySQL server"

Verifique:

  • servidor;
  • porta;
  • firewall;
  • serviço MySQL;
  • conectividade de rede;
  • usuário;
  • configuração do MySQL.

A porta padrão geralmente utilizada pelo MySQL é:

3306

mas ela pode ser alterada na configuração do servidor.


29. FireDAC + MySQL é uma boa combinação?

Sim, especialmente para aplicações Delphi que precisam trabalhar diretamente com bancos relacionais.

O FireDAC fornece uma camada integrada ao ecossistema Delphi e permite trabalhar com diferentes bancos de dados utilizando conceitos semelhantes.

Isso facilita a construção de sistemas que utilizam:

Delphi
   │
   ▼
FireDAC
   │
   ▼
MySQL

E também permite que a aplicação utilize recursos importantes como:

  • parâmetros;
  • transações;
  • consultas;
  • stored procedures;
  • datasets;
  • conexão persistente;
  • tratamento de erros;
  • diferentes drivers de banco.

30. Conclusão

Conectar Delphi ao MySQL utilizando FireDAC é relativamente simples. O ponto mais importante é pensar além da simples conexão.

Uma aplicação profissional precisa considerar:

  • organização do código;
  • configuração externa;
  • tratamento de erros;
  • segurança;
  • transações;
  • parâmetros SQL;
  • compatibilidade da biblioteca cliente;
  • permissões do usuário do banco;
  • facilidade de manutenção.

O uso de um arquivo config.ini permite separar a configuração do banco do executável:

MeuSistema.exe
       +
config.ini
       +
MySQL

Essa abordagem torna a aplicação muito mais fácil de configurar em diferentes ambientes.

Para projetos maiores, o próximo passo é criar uma camada de acesso a dados centralizada, utilizando um TDataModule, classes de conexão e serviços responsáveis pelas operações de cada módulo do sistema.

Dessa maneira, o Delphi deixa de ter apenas uma conexão funcionando e passa a utilizar uma estrutura de acesso a dados organizada e preparada para crescer.


Código rápido para guardar

Se você chegou até aqui e quer apenas a essência do exemplo, esta é a estrutura principal:

config.ini

[DATABASE]
DriverID=MySQL
Server=localhost
Port=3306
Database=meubanco
User_Name=app_sistema
Password=senha
CharacterSet=utf8mb4

Delphi

var
  Ini: TIniFile;

begin

  Ini := TIniFile.Create(
    IncludeTrailingPathDelimiter(
      ExtractFilePath(ParamStr(0))
    ) + 'config.ini'
  );

  try

    FDConnection1.DriverName :=
      Ini.ReadString(
        'DATABASE',
        'DriverID',
        'MySQL'
      );

    FDConnection1.Params.Values['Server'] :=
      Ini.ReadString(
        'DATABASE',
        'Server',
        'localhost'
      );

    FDConnection1.Params.Values['Port'] :=
      Ini.ReadString(
        'DATABASE',
        'Port',
        '3306'
      );

    FDConnection1.Params.Values['Database'] :=
      Ini.ReadString(
        'DATABASE',
        'Database',
        ''
      );

    FDConnection1.Params.Values['User_Name'] :=
      Ini.ReadString(
        'DATABASE',
        'User_Name',
        ''
      );

    FDConnection1.Params.Values['Password'] :=
      Ini.ReadString(
        'DATABASE',
        'Password',
        ''
      );

    FDConnection1.LoginPrompt := False;
    FDConnection1.Connected := True;

  finally
    Ini.Free;
  end;

end;

Esse é um bom ponto de partida para transformar a conexão Delphi + MySQL em uma estrutura mais profissional.


Perguntas frequentes

Posso usar FireDAC com MySQL 8?

Sim. O FireDAC possui suporte ao MySQL, mas é importante utilizar uma biblioteca cliente compatível com a versão do driver e com a arquitetura da aplicação.

Preciso colocar o libmysql.dll junto do EXE?

Dependendo da configuração e da versão utilizada, a aplicação poderá precisar da biblioteca cliente do MySQL. A DLL precisa ser compatível com a arquitetura e o driver utilizados.

Posso guardar a senha no arquivo INI?

Tecnicamente sim, mas um arquivo INI comum não protege a senha. Para sistemas comerciais ou ambientes sensíveis, considere uma estratégia de armazenamento mais segura.

Posso usar esse método em um sistema comercial?

Sim, a técnica de utilizar configuração externa e FireDAC pode ser aplicada em sistemas comerciais. O cuidado principal deve estar na arquitetura, segurança das credenciais, permissões do banco e distribuição das bibliotecas necessárias.

É melhor usar FireDAC ou ZeosLib?

São tecnologias diferentes que podem atender necessidades semelhantes de acesso a banco. Se você já utiliza Delphi moderno e FireDAC atende ao projeto, ele oferece uma integração muito conveniente com o ecossistema Delphi. A escolha deve considerar requisitos, experiência da equipe, compatibilidade e dependências do projeto.