Repository navigation
dbware
Home > Banco de dados (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┘
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.
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 |
- Um
TRALClientcomBaseURLe motor (O cliente). - Um
TRALDBConnection(paleta RAL - Client):Client= oTRALClient,ModuleRoute= oDomaindo módulo (ex.:/db; vazio =/). - Um formato de transporte (paleta RAL - Storage):
TRALStorageBINLink(binário, o mais rápido),TRALStorageJSONLink,TRALStorageCSVLinkouTRALStorageBSONLink. - 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 servidorLigue num TDataSource e numa grade como qualquer dataset.
RALDBFDMemTable1.UpdateTable := 'clientes'; // a tabela que recebe as alterações
RALDBFDMemTable1.Edit;
RALDBFDMemTable1.FieldByName('nome').AsString := 'Ana Maria';
RALDBFDMemTable1.Post;
RALDBFDMemTable1.ApplyUpdates; // envia ao servidorComandos 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.
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 🚧).
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.
| 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
|
Começar
Servidor
- Rotas e parâmetros
- Ler o pedido e responder
- Plugins 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- Swagger e Postman
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
Cliente
Motores
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar