Laboratório de
Programação I
Carlos Oberdan Rolim
Ciência da Computação
Sistemas de Informação
Aplicação com
Bancos de dados usando dbExpress
Parte I
Introdução teórica
O C++ Builder oferece uma série de ferramentas e recursos
que possibilitam a criação de aplicações de bancos de dados
de forma rápida e fácil.
A seguir serão introduzidos os conceitos básicos na
manipulação com bancos de dados em C++ Builder,
oferecendo uma visão geral dos componentes de acesso a
dados mais corriqueiramente utilizados.
Bancos relacionais e não relacionais
Relacionais
É um conceito abstrato que define maneiras de armazenar, manipular e
recuperar dado estruturados na forma de tabelas
Segue o modelo relacional
Usa um RDBMS (Relational Database Management System) que
implementa a absração
Linguagem padrão de consulta é o SQL
Ex.: Mysql, SQLServer, Oracle
Não relacionais
Mantém tudo agrupado em uma única tabela
É uma lista simples que não se refere a outros dados
Simples de manter
Não usa SQL
Ex.:Paradox, dBase, Big Table (google)
O inicio: BDE
Por muito tempo foi o coração das aplicações de bancos de
dados do C++ Builder está no Borland Database Engine
(BDE),
Ele é uma camada de software que realiza o acesso a
bancos de dados baseados em arquivos como Paradox e
dBase ou a servidores de bancos de dados locais ou
remotos como InterBase, Informix, Oracle, SyBase, etc.
Os componentes de bancos de dados do C++ Builder
oferecem uma forma simplificada, que usa programação
visual baseada em Propriedades, Métodos e Eventos para
acessar a API do BDE.
DBE com relação a base de dados
Situação antes do BDE
Linguagens diferentes
Características diferentes
Falta de portabilidade
Baixa conectividade
Necessidade de importação / exportação de dados
Problema
Dificuldade de manutenção
Dificuldade de formação de pessoal
Características do DBE
Orientado a Objetos
Possui Driver específico para cada SGBD
Os arquivos do BDE devem ser distribuídos junto com a
aplicação
Compatível com os principais SGBDs do mercado
Permite navegação com SQL
A evolução: dbExpress
É uma camada de software independente de base de dados
com um conjunto de interfaces que fornecem uma série de
métodos para processamento dinamico de SQL.
Considerado como a próxima geração no acesso a dados
dos produtos da Embarcadero
Evolução do BDE
Possui melhor performance e menor consumo de recursos
que o BDE
Remove uma série de complexidades envolvidas na
configuração do BDE
Aba dbExpress
Os componentes dbExpress estão localizados na aba
dbExpress
Antes de começar a trabalhar com esses componentes
precisamos entender a arquitetura de acesso aos dados...
Arquitetura de acesso
Para fins de flexibilidade podem ser implementados
diferentes formas de acesso através de componentes
variados
Porém sempre será baseado em uma arquitetura em
camadas visando facilitar o desenvolvimento de aplicações
A figura a seguir ilustra a forma como iremos acessar os
dados em nossas aplicações
Arquitetura de acesso
Aplicação
Data
Controls
Data Source
Componentes
visuais
Componentes
de
Data Set
acesso
dbExpress / BDE
Base de dados
Classes de componentes
Há duas grandes classes de componentes: os componentes
de acesso a dados (data-access) e os componentes de
controle, visualização e manipulação dos dados (datacontrols)
Os componentes de visualização e manipulação de dados
são também denominados de componentes data-aware
(componentes capazes de mostrar e atualizar os dados
armazenados em uma tabela associada)
Estes dois grupos de componentes estão localizados,
respectivamente, nas paletes Data Access e Data Controls
Conceito de Dataset
Para manipular um banco de dados é preciso
compreender o conceito de dataset
Um dataset é um objeto que consiste de uma série de
registros, cada um contendo qualquer quantidade de
campos e um ponteiro para o registro atual.
O dataset pode ter uma correspondência direta, umpara-um, com uma tabela física, ou, como um resultado
de uma query, pode ser um subconjunto de uma tabela
ou uma junção de diversas tabelas
Tipo de objeto TDataSet
Um dataset é o tipo de objeto TDataSet e é uma classe
abstrata.
Uma classe abstrata é uma classe de onde você pode
derivar outras classes, mas não pode criar uma variável
desta classe. Por exemplo, ambos os componentes Query e
Table classificam-se como componentes TDataSet porque
cada um foi derivado do objeto TDataSet.
Note que você não encontrará nenhum componente
chamado TDataSet na Component Palette.
O TDataSet contém as abstrações necessárias para
manipular diretamente uma tabela.
É a ferramenta utilizada para abrir uma tabela e navegar por
suas colunas e linhas.
Dataset no dbExpress
Os principais componentes do tipo dataset utilizados pelo
dbExpress são quatro:
TSQLDataSet
 classe TDataSet
TSQLQuery
 classeTQuery
IMPORTANTE
TSQLStoredProc  classe TStoredProc
TSQLTable
 classe Ttable
São datasets unidirecionais. Eles podem enviar comandos para
a base de dados e se retornar um conjunto de dados obtem-se um
cursor apontando para esse dados. Não é feito buffer dos dados,
isso impossibilita a edição direta dos registros (pois isso necessita
bufferizar os dados). Para editar pode-se usar diretamente um sql
de update nos dados ou então associar o dataset a um “Client
Dataset” visto adiante. Em um dataset Você só pode navegar
usando os métodos First e Next.
TSQLDataSet
Representa qualquer dado obtido pelo dbExpress
O SQLDataSet permite mostrar o resultado de uma
consulta ou de uma StoredProcedure, executar
StoredProcedures que não retornem dados, ou obter os
parâmetros disponíveis no banco(tabelas, StoredProcedures,
campos de uma tabela).
Ele não suporta atualização de dados na memória,
atualizações devem ser feitas utilizando-se a sintaxze SQL
diretas no servidor.
TSQLDataSet
Propriedade
Significado
Active
Define se o componente está ativado, e executando
o comando passado em CommandText, visto logo
abaixo.
CommandText
Define o comando em linguagem SQL a ser
passado. Podem ser passadas consultas, inclusões
e etc..
CommandType
Define o tipo do comando que foi passado em
CommandText. Seus valores são ctQuery,
ctStoredProc e ctTable.
DataSource
Define qual será o objeto TDataSource que será
conectado ao SQLDataSet.
SQLConnetion
Define qual será o componete do tipo
TSQLConnection que proverá acesso ao banco.
Params
Para passar parametros a query
TSQLQuery
O SQLQuery executa comandos SQL no banco de dados,
retornando resultados de consultas, inclusões, exclusões e
etc..
O SQLQuery também é unidirecional, só suportando a
execução de comandos SQL.
Propriedade
Significado
Active
Define se o componente está ativado
SQL
É onde devemos informar qual comando SQL
deverá ser executado
pela Query.
SQLConnetion
Define qual será o componete do tipo
TSQLConnection que proverá acesso ao banco.
Params
Para passar parametros a query
TSQLStoredProc
O SQLStoredProc é um componte específico para a
execução de stored procedures existentes no banco.
Pode armazenar o resultado de uma stored procedure que
retorne um cursor(posição).
Também é um componente unidirecional. As execuções das
stored procedures são em sintaxe SQL.
Propriedade
Significado
Active
Define se o componente está ativado
StoredProcName
Define o nome da stored procedure a ser executada
e seus parâmetros, se existirem.
SQLConnetion
Define qual será o componete do tipo
TSQLConnection que proverá acesso ao banco.
Params
Para passar parametros a query
TSQLTable
O SQLTable representa uma tabela do banco de dados.
O TSQLTable traz todas as colunas e linhas da tabela
especificada, mas também é um componente unidirecional,
não permitindo a movimentação entre os registros.
Trabalha com uma única tabela de cada vez, podendo
realizar alterações, inclusões etc..
Propriedade
Significado
Active
Define se o SQLTable está conectado à tabela
especificada.
SQLConnetion
Define qual será o componete do tipo
TSQLConnection que proverá acesso ao banco.
TableName
É onde definimos qual o nome da tabela a ser
acessada.
Client DataSet
Armazena os dados de uma tabela em memória (buffer dos
dados)
Utilizado para fazer edição de dados de uma tabela
É um componente muito útil pois habilita a edição, pesquisa,
filtros, etc nos campos de uma tabela (lembre-se que
datasets unidirecionais não possibilitam isso)
Propriedade
Significado
Active
Ativa o Dataset
ProviderName
Liga o componente a um DataSet Provider
DataSet Provider
Armazena todos enviados pelo um ClientDataSet em memória,
efetua os logs e dispara o comando SQL de Update quando o
método ApplyUpdates do ClientDataSet for invocado
Se for usar um ClientDataSet na aplicação deve-se usar um
DataSetProvider
É o intermediário entre uma tabela e um ClientDataSet
Propriedade
Significado
Dataset
Define a que dataset o componente está ligado
UpdateMode
Define como será determinado se outro usuário atualizou o
registro que está tentando-se atualizar desde que ele foi
lido:
-upWhereAll: Faz o update falhar se o registro foi
atualizado por outro usuário
-upWhereChanged: atualiza somente os campos que você
alterou
-upWhereKeyOnly: vai usar somente as chaves primárias
na claususa WHERE do SQL
SimpleDataSet
SimpleDataSet combina um SQLDataSet, DataSetProvider e
um ClientDataSet em um único componente
Proporciona uma conexão bidirecional (suporte a
navegação completa e edição)
Se deseja-se visualizar ou editar dados de uma única tabela
ou stored procedure o SimpleDataSet é a solução mais
rápida
O SimpleDataSet pode trabalhar desconectado mas os
dados mostrados não serão mais atuais
SimpleDataSet
Propriedade
Significado
Active
Define se o componente está conectado ao
SQLConnection, e portanto com as informações
atualizadas.
Connection
Define qual será o componente que proverá acesso
ao banco de dados.
DataSet
Esta propriedade refere-se a classe DataSet interna
do SimpleDataSet. Suas subpropriedades são:
DataSet.Active: define se o dataset interno está
ativo.
DataSet.CommandText: define qual será o
comando SQL passado ao dataset.
DataSet.CommantType: define qual é o comando
passado em CommandText. Seus valores são
ctQuery, ctStoredProc e ctTable.
Atente que são os mesmos conceitos do já vistos no
SQLDataSet.
TSQLMonitor
O SQLMonitor é um componente utilizado para fazer a
depuração da comunicação entre a aplicação e o servidor de
banco de dados.
Ele grava em log os comandos SQL de uma conexão,
adicionando à uma StringList.
TSQLMonitor
Propriedade
Significado
Active
Define se o SQLMonitor está ativo e monitorando as
mensagens passadas ao banco.
AutoSave
Define qual será o arquivo no disco que receberá os
logs da conexão
FileName
É onde definimos qual o nome da tabela a ser
acessada.
SQLConnetion
Define qual será o componete do tipo
TSQLConnection que proverá
acesso ao banco.
TraceList
É a propriedade utilizada para se acessar a lista de
comandos logados. É do tipo StringList. A lista é
automaticamente atualizada quando o componente
de conexão passa alguma mensagem ao
banco.
TSQLConnection
Responsável pela conexão física com o bando de dados
É através dele, que obtemos o acesso aos dados, mas não
acesso direto ao conteúdo das tabelas, pois isto é feito
utilizando-se os outros componentes.
Exemplo de
conexão em um
banco mySQL
TSQLConnection
Propriedade
Significado
Connected
Define se o componente está conectado ao banco.
ConnectionName
Define o nome da conexão a ser utilizada
Driver
Define o driver que vai ser usado para acesso ao
banco. No nosso caso vamos usar Mysql. Clicando no
+ abre parâmetros de configuração, destacam-se:
+ Hostname Endereco onde está o banco mysql
+ Username Nome do usuario mysql
+ Password
Senha
LoginPrompt
Define se o componente vai requerer o nome do
usuário e a senha no nomento da conexão.
Name
Nome do componente. Vai ser referenciado por outros
componentes para manipular os dados
Componentes Data Access
Os componentes Data Access estão na página Data Access
da Component Palette.
Eles, juntamente com os componentes Data Control, são
componentes data-aware.
Componentes data-aware são componentes que tem ciência de dados
e sua estrutura em um banco de dados.
O componente Data Access que mais vamos utilizar é o
TDataSource
O Data Source deve ser utilizado como “meio de campo” sempre
que um dataset retornar um cursor que será manipulado por um
componente data control
Em uma típica aplicação de banco de dados, um componente
DataSource é associado com um componente DataSet (Table ou
Query) e um ou mais componentes Data Control (tais como DBGrid).
Data Source
O componente DataSource é a interface entre um
componente dataset e os componentes data-aware nos
formulários.
O DataSource liga-se a um dataset através da
propriedade Dataset.
Os componentes Data-aware, como DBEdit e DBGrid, ligamse ao DataSource através de suas propriedades
DataSource.
Usualmente há apenas um DataSource para cada dataset,
no entanto pode-se conectar a um dataset tantos
DataSource quantos forem necessários.
Para monitorar-se alterações no estado do dataset
associado ao DataSource pode-se associar um método ao
evento OnStateChange.
Data Source
Relacionamento entre os componentes
Componentes Data Control
Os componentes Data Control dão às suas aplicações de
banco de dados uma interface visual consistente, quer sua
aplicação acesse um arquivo de banco de dados local ou um
servidor remoto.
Baseado na instalação padrão, os componentes Data
Control estão localizados na página Data Controls da
Component Palette.
Componentes Data Control
Estes componentes fornecem um conjunto de componentes
data-aware de interface de usuário, que você pode utilizar
para criar aplicações baseadas em forms.
Como mencionado anteriormente, os componentes Data
Control e Data Access são data-aware.
Além da função de um componente Standard, componentes
Data Control também podem exibir dados de um campo de
uma tabela de um banco de dados ou enviar dados à uma
tabela de um form.
Componentes Data Control
Componentes Data Control
Componentes Data Control
Componentes Data Control
TDBGrid
É um componente Data Control
Apresentado na interface do usuário
Mostra os registros de uma tabela na forma de uma grade
Cada coluna é um campo e cada registro é uma linha
A vantagem deste tipo de saída de dados é que é possivel
ver vários registros ao mesmo tempo.
Pode-se clicar duas vezes e invocar o Column Editor para
editar as colunas do grid
Deve ser ligado a um componente data source
TDBNavigator
Permite navegar pelos registros de uma tabela
Pode-se mover o ponteiro de registro da tabela para frente
ou para trás
Iniciar o modo Insert ou Edit
Efetuar inserção de novos registros ou modificados (post)
Cada um dos botões do DBNavigator chama um
método do Componente Table ao qual está ligado
Deve ser ligado a um componente data source
TDBNavigator e comandos equivalentes
Atenção: <Tabela> corresponde a um componente DataSet, como
por exemplo um SimpleDataSet
Prática
Vamos implementar um programa que permite visualizar os dados de
um tabela
Formulário principal
Crie o formulário do slide anterior com os seguintes
componentes:
DBGrid
DBNavigator
Criar a base de dados no Mysql
CREATE DATABASE cadastro;
USE cadastro;
CREATE TABLE `usuarios` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`nome` varchar(255) DEFAULT NULL,
`cidade` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `cidade` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `usuarios` VALUES (1,'Ober',1),(2,‘Maria’,1);
INSERT INTO `cidade` VALUES (1,'Santo Angelo');
Criar o Data Module
Em aplicações de banco de dados é uma boa prática utilizar
um Data module para os componentes de banco
Para incluir usar o seguinte caminho “File / New / Other /
C++ Builder File / Data module”
Inclua no datamodule um SQLConnection, um
SimpleDataSet e Um DataSource
Não esqueça de dar um Use Unit no Data Module no
Form1 (Alt + F11)
Ajuste as seguintes propriedades
SQLConnection
Driver: mysql
Database: cadastro
Password: root  sua senha
UserName: root  seu usuario
LoginPrompt: false
Muda a propriedade Connect para true para efetuar a conexão
Ajuste as seguintes propriedades
SimpleDataSet
Connection: SQLConnection1
DataSet
CommandText: select * from `usuarios`
CommandType: ctQuery
Active: true
DataSource
Dataset: SimpleDataSet1
Enable: true
Ajuste os eventos
Ajuste os seguintes eventos do SimpleDataSet acrescendo
as seguintes linhas de código
AfterPost  disparado após operação de edit ou insert
SimpleDataSet1->ApplyUpdates(0); // Esse metodo envia
comando para efetivar as alteracoes efetuadas na tabela no banco
de dados
AfterDelete  disparado após uma deleção
SimpleDataSet1->ApplyUpdates(0);
Download

db_parte1