Você está na página 1de 5

Simple DataSet

Simplicidade e praticidade no acesso a BD com


dbExpress

Neste artigo conheceremos um pouco mais sobre o componente SimpleDataSet do


dbExpress, destacando seus recursos, cuidados com sua utilizao, vantagens e
desvantagens frente ao ClientDataSet. Agradeo aos vrios leitores que enviaram
e-mails sugerindo uma matria sobre o assunto, em especial ao colega Mrcio D.
Marcondes, que gostaria tambm de saber por que o SQLClientDataSet foi
descontinuado no Delphi 7. Antes de iniciarmos os estudos sobre o SimpleDataSet,
para entendermos o porqu da sua existncia.

Componentes dbExpress

At o surgimento do dbExpress no Kylix 1 (e mais tarde no Delphi 6), o BDE


(Borland DataBase Engine) era o principal mecanismo de acesso a dados no Delphi.
O BDE no deve mais ser utilizado para novas aplicaes, seu uso no mais
recomendado pela Borland, sendo recomendado a utilizao do dbExpress para
aplicaes VCL.
Assim como muitos desenvolvedores, por vrios anos utilizei o BDE, em especial
para acesso ao DB2 e Oracle, at que surgisse o dbExpress. Apesar do dbExpress
ter componentes semelhantes ao BDE, eles funcionam de forma bastante diferente.
Por exemplo, voc no usa um SQLQuery do dbExpress como usava um Query do
BDE. O dbExpress foi cuidadosamente projeto para ser independente de arquitetura
(2 ou 3 camadas). Cada componente no dbExpress tem uma tarefa distinta: voc
no pode usar um SQLQuery para conectar ao banco, fazer cache de dados,
navegar, alterar dados e resolver as atualizaes em cache. Voc deve usar
componentes diferentes para funes diferentes. No BDE, contrariando princpios
bsicos da OO, era possvel usar um simples Query para realizar tudo isso - tarefa
que no dbExpress envolve a utilizao de no mnimo quatro componentes. Claro, no
BDE possvel usar um DataBase para centralizar a conexo, mas isso no era
obrigatrio e um UpdateSQL, caso queira utilizar Cache-Updates.
Usando dbExpress, voc precisa normalmente de um SQLConnection, SQLQuery /
SQLDataSet, DataSetProvider e um ClientDataSet. Veja:

Figura 1. Conexo dbExpress


Vale lembrar que o ClientDataSet e o DataSetProvider no pertencem exatamente
ao dbExpress, mas so utilizados em conjunto com a tecnologia.
Como no dbExpress cada componente desempenha uma tarefa distinta, fica muito
simples migrar uma aplicao do modelo 2 camadas para o modelo 3 camadas:

Figura 2. Ao usar dbExpress, migrao para 3 camadas facilitada


Uma discusso detalhada sobre dbExpress ou DataSnap est fora do escopo deste
artigo. Sugiro que o leitor consulte a edio 46 da Revista ClubeDelphi. L
mostramos como construir passo a passo uma aplicao 2 camadas usando
dbExpress e depois facilmente migramos para 3 camadas. O que quero deixar claro
aqui, o motivo pelo qual o dbExpress utiliza vrios componentes. Para quem est
vindo do BDE, sugiro tambm dar uma olhada no comparativo dbExpress x BDE na
edio 38.
SQLClientDataSet

Ok, muito bom utilizar uma arquitetura como o dbExpress, que permite
desenvolver de forma transparente para diferentes arquiteturas. Mas est longe de
ser prtico construir uma aplicao 2 camadas, visto a variedade de componentes
que devem se utilizados, relacionados e configurados. Essa dificuldade fica ainda
mais evidente para aqueles que vem do BDE.
Pensando nisso, a Borland criou o SQLClientDataSet no Delphi 6. Esse componente
na verdade o conjunto de 3 componentes:

O SQLClientDataSet descendente de TCustomCachedDataSet, que descende de


TCustomClientDataSet (classe base do ClientDataSet). Ele utiliza composio para
usar recursos de um SQLDataSet e um DataSetProvider, que so criados
internamente e no ficam expostos. Veja a seguir um fragmento do cdigo fonte
desse componente, retirado dos fontes da VCL:

TCustomCachedDataSet = class(TCustomClientDataSet)
private
FProvider: TDataSetProvider;
...

TSQLClientDataSet = class(TCustomCachedDataSet)
private
FDataSet: TSQLDataSet;
FSQLConnection: TSQLConnection;
...

Com isso, muito simples criar uma aplicao sem que seja necessrio configurar e
relacionar uma variedade de componentes, visto que tudo feito internamente pelo
SQLClientDataSet. Essa abordagem, no entanto, tem algumas desvantagens:
Uma migrao para 3 camadas ficaria difcil, pois no h uma separao fsica
entre os componentes;
No h maneira direta de acessar os recursos, propriedades e eventos dos
componentes internos (SQLDataSet e DataSetProvider);
No possvel configurar os TFields do SQLDataSet interno;
O componente foi descontinuado no Delphi 7;
Como o DataSetProvider e o ClientDataSet podem ser utilizados com outras
tecnologias de acesso a dados (como BDE ou IBX), a Borland resolveu criar
variantes do SQLClientDataSet, que ao invs de usarem dbExpress internamente,
podem usar BDE ou IBX. So eles:

Esses dois componentes, mais o SQLClientDataSet, so conhecidos no Delphi como


Cached DataSets.

Instalando o SQLClientDataSet no Delphi 7

O SQLClientDataSet no vem mais no Delphi 7, mas muito simples instal-lo.


Clique em File|New|Other>Package e salve o pacote como pkSQLClientDataSet.dpk
em um diretrio sua escolha. No editor clique no boto Options, e na opo
Directories/Conditionals digite $(Delphi)\Bin para a opo Output directory e
$(Delphi)\Lib para as opes Unit output directory e DCP output directory. Volte ao
editor, clique em Add e adicione ao pacote as units DBLocalS.pas e DBLRegS.pas
que esto no diretrio (Delphi)\Bin\Demos\DB\SQLClientDataSet. Finalize o
processo clicando no boto Install.

SimpleDataSet

O SQLClientDataSet apresentou vrios problemas no Delphi 6, tanto que, morreu


por ali mesmo. No Delphi 7 ele foi descontinuado, dando lugar ao SimpleDataSet.
Esse componente, que tambm descendente de TCustomClientDataSet, na
verdade o conjunto de quatro componentes:

Veja a seguir um fragmento do cdigo fonte desse componente, retirado dos fontes
da VCL:

TInternalSQLDataSet = class(TCustomSQLDataSet)
...

TSimpleDataSet = class(TCustomClientDataSet)
private
FConnection: TSQLConnection;
FInternalConnection: TSQLConnection;
FDataSet: TInternalSQLDataSet;
FProvider: TDataSetProvider;
...

Ele possui algumas vantagens em relao ao SQLClientDataSet:


Possui uma conexo interna;
Permite acesso as propriedades e eventos do DataSet e SQLConnection internos
(Figura 3);
Permite configurar os TFields do DataSet interno (Figura 4);

Figura 3. Simple DataSet permite acesso ao SQLConnection e DataSets internos

Figura 4. Acessando os TFields do DataSet interno


O acesso aos TFields do DataSet interno interessante nesse caso, pois permite
configurar corretamente as ProviderFlags, que so utilizadas pelo DataSetProvider
para determinar quais campos devem ser utilizados em instrues de Update e
Delete.
O SimpleDataSet tambm tem desvantagens:
Uma migrao para 3 camadas tambm ficaria difcil, pelo mesmo motivo do
SQLClientDataSet;
O Componente no vem no Kylix, o que dificulta a criao de aplicaes cross-
platform; No entanto, se voc tiver o Delphi 7, possvel recompilar o componente
no Kylix a partir do cdigo fonte da unit SimpleDS.pas.
Cuidados ao usar o SimpleDataSet

Quando voc usa um Query do BDE, basta apontar a propriedade DataBaseName


para um Alias, o que dispensa o uso de um DataBase. Internamente era instanciada
uma conexo e compartilhada por todas as Queries que acessavam aquele Alias.
Mas cuidado, no dbExpress isso diferente: se voc usar um SimpleDataSet e
escolher um Connection.ConnectioName cada SimpleDataSet ter sua conexo
interna! E isso errado! Voc pode ter uma nica aplicao consumindo dezenas de
conexes com o servidor SQL.
Se voc for usar mais de um SimpleDataSet, coloque um SQLConnection no
DataModule e aponte a propriedade Connection dos SimpleDataSets para a conexo
externa (Figura 6). Dessa forma, no sero criadas conexes internas.

Figura 5. Quando tiver vrios SimpleDataSets, use uma conexo externa

Usar ou no usar o SimpleDataSet?

Pessoalmente aconselho que, sempre que possvel, utilize os componentes


separadamente. Apesar da configurao do acesso ser um pouco mais trabalhosa e
cansativa, quando comparada ao Query / Table do BDE, essa abordagem
muitomais flexvel e deixa voc com total domnio da situao.

Configurao rpida

Mas ainda vamos precisar configurar vrios componentes no DataModule para


acessar uma simples tabela, e isso est longe de produtivo. Claro, esse um preo
que pagamos para ter uma maior flexibilidade e controle. Com a finalidade de dar
produtividade ao desenvolvimento com dbExpress, desenvolvi um editor de
componente (Figura 6) para facilitar a vida de quem trabalha com dbExpress. Basta
colocar um SQLQuery ou SQLDataSet, dar um clique de direita sobre ele e abrir o
editor. Configure visualmente os parmetros de acesso, e pronto, todos os
componentes sero criados e relacionados automaticamente (Figura 7), incluindo
SQLConnection, SQLDataSet / SQLQuery, DataSetProvider, ClientDataSet,
DataSource e at mesmo controles Data-Aware (inclusive para IntraWeb). O editor
possui ainda um Query Builder e possibilidade de exportao de dados para Word,
Excel, HTML, XML e TXT.

Figura 6. Editor facilita a vida de quem trabalha com dbExpress

Figura 7. Componentes automaticamente criados e relacionados pelo editor


Para aqueles que desejarem ver como o editor foi criado, ou mesmo se aprofundar
no assunto sobre criao de editores de componente, consulte as edies 47 e 49
da Revista ClubeDelphi.
O endereo para download do editor (incluindo cdigo fonte) :
http://codecentral.borland.com/codecentral/ccweb.exe/author?authorid=222668

Aps baixar o editor e descompactar os arquivos, basta abrir o arquivo .dpk, clicar
em Install e confirmar as alteraes sugeridas pelo Delphi.

Use mais de um DataModule


Uma ltima dica com relao a organizao dos componentes no DataModule,
para aqueles que desejarem usar os componentes separadamente ao invs de
utilizar SimpleDataSets. Para grande sistemas, aconselho a criao de DataModules
por entidade. E mais, para quem usa dbExpress, aconselho criar um DataModule
servidor (com os componentes dbExpress e DataSetProviders) e um cliente,
com os ClientDataSets (Figura 8). Isso mesmo para uma aplicao duas camadas.
Dessa forma, voc no ter imensos DataModules com dezenas de componentes, e
essa diviso tornar mais flexvel o processo de migrao para 2 camadas. Isso foi
demonstrado na edio 46.

Figura 8. Separao dos componentes de acesso a dados em dois DataModules, mesmo em uma aplicao duas
camadas.
Um abrao todos e at a proxima!