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]
SemOnValidateSQL, qualquer cliente (logado, se houver
autenticação) roda qualquer SQL, inclusiveDROP 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 2.0 🚧 |
abre MinSize conexões ao ligar o servidor |
TRALClient com BaseURL e motor (O cliente).TRALDBConnection (paleta RAL - Client): Client = o TRALClient,ModuleRoute = o Domain do módulo (ex.: /db; vazio = /).TRALStorageBINLinkTRALStorageJSONLink, TRALStorageCSVLink,TRALStorageBSONLink ou TRALStorageXMLLink 2.0 🚧 - XML, que noTBufDataset quando os dois| 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.
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.
2.0 🚧Com ProcOptions.Enabled, o módulo chama as procedures do banco pelo nome numa rota
só, proc/<nome> - para os datasets do RAL (StoredProcName + ExecProc) e para
qualquer cliente HTTP. AutoCommit := False no módulo, ou StartTransaction/Commit
no TRALDBConnection, gravam um pedido inteiro ou nada. Tudo em
Stored procedures.
[!NOTE]
Desde a1.2 🚧,ApplyUpdateseExecSQLlevantam exceção quando falham, e
umUPDATE/DELETEque não acha exatamente um registro (alguém mudou ou apagou
antes) é erro. Antes, a falha só ia paraOnError. Para umUpdateSQLque mexe em
vários registros de propósito, desligueCountUpdatedRecords.
TRALFDConnection no servidor e TRALFDQuery no cliente (paleta RAL - DAO,
pacote RALDBFireDACObjects, RALDBFireDACDAOPackage na 2.0 🚧): 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; RALStorageTypes na 2.0 🚧) 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 |
Invalid structure version num servidor antigo |
cliente 2.0 🚧 falando com servidor 1.x | RALLegacyWire := True no cliente, ou atualize o servidor |
Rolled back: another statement of the same request failed. 2.0 🚧 |
AutoCommit desligado ou a fila do cliente: outro comando falhou |
o comando que falhou traz o erro de verdade |
Wiki: _Sidebar
Wiki: autenticacao
Wiki: cliente
Wiki: desempenho
Wiki: instalacao_delphi
Wiki: instalacao_lazarus
Wiki: problemas comuns
Wiki: qual motor
Wiki: recursos
Wiki: seguranca
Wiki: storage xml
Wiki: stored procedures