480 likes | 613 Views
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.
E N D
Laboratório de Programação I Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
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.
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 Componentes visuais Data Controls Data Source Componentes de acesso Data Set 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 (data-controls) • 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, um-para-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 • 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. IMPORTANTE
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.
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.
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.
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..
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)
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
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
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.
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
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, ligam-se 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.
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);