Skip to content
mobius1qwe edited this page Oct 7, 2026 · 1 revision

Home > Banco de dados (DBWare)

Banco de dados pela rede (DBWare)

Vale para a 1.1 em diante · Delphi e Lazarus · Nível: intermediário

Em uma frase: o cliente abre um dataset com um SELECT como se o banco fosse local, mas quem fala com o banco é o servidor RAL.

Você vai precisar: os pacotes de banco instalados (RALDBPackage + o link do seu componente de acesso: FireDAC, Zeos ou SQLDB; ver Instalação) e o driver do banco na máquina do servidor (ex.: fbclient.dll para Firebird).

 Cliente                                          Servidor
 TRALDBFDMemTable ─┐                              ┌─ TRALDBModule ── FireDAC/Zeos/SQLDB ── banco
 TRALDBConnection ─┼── TRALClient ── rede ── TRALServer
 TRALStorageBINLink┘

No servidor

Coloque um TRALDBModule (paleta RAL - Modules) e configure:

Propriedade Exemplo O que é
Server RALIndyServer1 o servidor
DatabaseLink FireDAC, Zeos ou SQLDB o componente de acesso que o servidor usa
DatabaseType dtFirebird, dtSQLite, dtMySQL, dtPostgreSQL o banco
Database, Hostname, Port, Username, Password C:\dados\LOJA.FDB a conexão
LibLocation C:\Firebird\fbclient.dll a biblioteca cliente do banco, se não estiver no caminho padrão
CharacterSet vazio vazio = o padrão do driver (UTF8 no Firebird)
ConnectionParams busytimeout=10000 parâmetros extras do driver, um por linha
Domain db prefixo das rotas: /db/opensql... (vazio = na raiz)
OnValidateSQL — aprove ou recuse cada SQL (Segurança)

E no uses (ou arrastando o componente do link): RALDBModule, RALDBBase (para escrever dtFirebird no código) e o driver: RALDBFireDAC, RALDBZeos ou RALDBSQLDB.

O módulo cria as rotas opensql, execsql, applyupdates, gettables, getfields e getsqlfields.

Warning

Sem OnValidateSQL, qualquer cliente (logado, se houver autenticação) roda qualquer SQL, inclusive DROP TABLE.

Pool de conexões (desde a 1.1)

Sem pool, cada pedido abre e fecha uma conexão com o banco. Com pool, elas são reaproveitadas:

PoolOptions. O que faz
Enabled liga o pool (desligado por padrão)
MinSize / MaxSize mínimo mantido / máximo aberto
WaitTimeout ms esperando uma conexão livre; passou disso, o cliente recebe 429
IdleTimeout, MaxLifetime, MaxUses quando fechar e renovar conexões
ValidateOnAcquire testa a conexão antes de entregar
PrepareOnActivate 1.3 🚧 abre MinSize conexões ao ligar o servidor

No cliente

  1. Um TRALClient com BaseURL e motor (O cliente).
  2. Um TRALDBConnection (paleta RAL - Client): Client = o TRALClient, ModuleRoute = o Domain do módulo (ex.: /db; vazio = /).
  3. Um formato de transporte (paleta RAL - Storage): TRALStorageBINLink (binário, o mais rápido), TRALStorageJSONLink, TRALStorageCSVLink ou TRALStorageBSONLink.
  4. O dataset, conforme o componente de acesso do cliente:
Dataset IDE
TRALDBFDMemTable Delphi, FireDAC
TRALDBZMemTable Delphi e Lazarus, Zeos
TRALDBBufDataset Lazarus, SQLDB
RALDBFDMemTable1.RALConnection := RALDBConnection1;
RALDBFDMemTable1.Storage := RALStorageBINLink1;
RALDBFDMemTable1.SQL.Text := 'select id, nome from clientes where cidade = :cidade';
RALDBFDMemTable1.Params.ParamByName('cidade').AsString := 'Recife';
RALDBFDMemTable1.Open;   // vai ao servidor

Ligue num TDataSource e numa grade como qualquer dataset.

Gravar

RALDBFDMemTable1.UpdateTable := 'clientes';   // a tabela que recebe as alterações
RALDBFDMemTable1.Edit;
RALDBFDMemTable1.FieldByName('nome').AsString := 'Ana Maria';
RALDBFDMemTable1.Post;
RALDBFDMemTable1.ApplyUpdates;                // envia ao servidor

Comandos sem retorno (UPDATE, DELETE, procedimentos): SQL.Text := ... e ExecSQL.

Note

Desde a 1.2 🚧, ApplyUpdates e ExecSQL levantam exceção quando falham, e um UPDATE/DELETE que não acha exatamente um registro (alguém mudou ou apagou antes) é erro. Antes, a falha só ia para OnError. Para um UpdateSQL que mexe em vários registros de propósito, desligue CountUpdatedRecords.

DAO do FireDAC (alternativa)

TRALFDConnection no servidor e TRALFDQuery no cliente (paleta RAL - DAO, pacote RALDBFireDACObjects): o cliente usa um TFDQuery de verdade e o ApplyUpdates do próprio FireDAC. Só Delphi com FireDAC nos dois lados. Tem OnValidateSQL e, para o ApplyUpdates, OnValidateApplyUpdates (1.2 🚧).

Falando com RAL mais antigo

A 1.2 🚧 envia NUMERIC/DECIMAL com todas as casas e datas com milissegundos, num formato que versões anteriores não leem. Se o outro lado for mais velho: RALLegacyWire := True (unit RALDBTypes) no lado novo.

Erros comuns

O que acontece Causa O que fazer
Malformed string (Firebird) com acentos charset errado deixe CharacterSet vazio (o RAL usa UTF8)
429 Timed out waiting for a free database connection. o pool esgotou aumente MaxSize ou WaitTimeout
500 SQL rejected by OnValidateSQL. OnValidateSQL recusou confira a sua regra
não acha a biblioteca do banco fbclient.dll/libpq.dll fora do caminho LibLocation
ApplyUpdates: a statement affected 0 records instead of 1... o registro mudou ou sumiu no banco desde o Open reabra e refaça a alteração
NUMERIC chega arredondado cliente ou servidor anterior à 1.2 🚧 atualize os dois, ou RALLegacyWire

Veja também

Clone this wiki locally