Tiago Santos Coelho
ADO.NET Introdução
Venho por este meio preencher uma lacuna existente na bibliografia portuguesa relativamente ao ADO.NET. Neste primeiro artigo iremos abordar a arquitectura do ADO.NET e como aceder aos dados existentes numa base de dados Access e a sua integração com aplicações Windows. Numa próxima oportunidade iremos abordar a edição e actualização de dados com ADO.NET! Arquitectura ADO.NET (System.Data)
Para ter acesso à funcionalidade ADO.NET, temos que utilizar componentes para realizar as tarefas relativas ao acesso a dados. O principal desses componentes é o DataSet. Este proporciona o acesso a tabelas, linhas, colunas e pode conter diversas tabelas. Na imagem que se segue, apresenta-se um diagrama com uma visão da arquitectura do ADO.NET
Nota: O acesso às funcionalidades do ADO.NET é feito através do namespace System.Data. System.Data Expões os objectos usados para aceder e armazenar dados através da criação de dados relacionados, armazenados na memória virtual. Esses objectos são independentes da fonte de dados. O namespace System.Data contem vários componentes, sendo alguns deles:
≡ DataSet
≡ DataTable
DataSet O DataSet é a base de dados Virtual; Tem a particularidade de não estar ligada à base de dados, ou seja, desconhece a fonte de dados (desconectado). Benefícios de usar o DataSet:
Um DataSet pode conter uma ou mais tabelas, essas tabelas podem ser de diferentes bases de dados. Cria restrições de integridade nas tabelas e também cria relações entre tabelas. Só os dados alterados é que são alterados na base de dados, estes dados antes de serem enviados, são temporariamente armazenados num ficheiro XML.
Tiago Santos Coelho
O componente mais importante é o DataSet, pois é este componente que abrange toda a funcionalidade de gerir dados armazenados na memória.
DataTable É um objecto chave dentro do namespace System.Data. Este objecto DataTable tem as seguintes propriedades:
≡ Columns – Contém uma lista de todas as colunas contidas numa tabela.
≡ Constraints – Regras de dados que sã aplicadas a uma tabela.
≡ ChildRelations – É uma colecção de relacionamentos que define as relações entre as tabelas e o DataTable.
≡ PrimaryKey – É uma matriz de objectos DataColumn que representa todas as colunas com as chaves primárias de um DataTable.
≡ Rows – Fornecem os dados actuais contidos numa tabela. Contem uma colecção de objectos DataRow.
≡ TableName – Representa o nome da DataTable. DataProvider O DataProvider tem todos os objectos necessários para aceder a uma base de dados específica. O VS.NET tem três providers, sendo eles:
≡ SQL Server (optimizado para usar o SQL Server);
≡ Genérico OLEDB (para drivers OLEDB; Base de dados relacionais; Ficheiros; entre outros)
≡ ODBC
System.Data.OleDb Este namespace contem objectos que fornecem a funcionalidade de aceder a dados através de um provedor OLE-DB (ex. Access). Os objectos são:
≡ OleDbConnection
≡ OleDbCommand
≡ OleDbDataSet
≡ OleDbDataReader
≡ OleDbDataAdapter Connection – É a classe que implementa a interface de conexão. Command – Objecto que representa uma instrução SQL executada através de um Connection. DataAdapter – Fornece dados ao DataSet e propaga as alterações do DataSet para a Base de Dados. O serviço do DataAdapter é “adaptar” os dados dos objectos Command e incluí-los no DataSet, levando assim os dados do DataSet à Base de Dados através dos objectos Command.
Tiago Santos Coelho
DataReader – Um DataReader é rápido e consome poucos recursos do sistema, sendo assim usado muitas das vezes em situações específicas.
A diferença entre DataReader e DataSet
Quando falamos de desempenho, a utilização de um DataReader leva vantagem, pois obtém o acesso aos dados assim que o objecto fica disponível, pelo contrário do DataSet, é necessário aguardar para que este fique preenchido, além disso o DataReader é do tipo ForwardOnly, ou seja, dados que são unicamente de leitura e com o acesso desde o primeiro registro até ao último. Com o DataSet pode-se “andar” para a frente ou para trás nos dados.
Tiago Santos Coelho
Exercícios Práticos Criação de um novo Projecto
File > New > Project Isto permite-nos criar um novo projecto. De seguida, escolhemos o tipo de projecto que queremos iniciar, que neste caso vai ser a tecnologia C#, como pode verificar na imagem que se segue.
Legenda: 1 – Tecnologia utilizada para elaborar o projecto. 2 – Tipo de Aplicação.
Tiago Santos Coelho
3 – O nome que damos ao nosso projecto. 4 – Localização do projecto gravado no computador. Após clicar em OK, vai-nos aparecer o seguinte ambiente:
De seguida, vamos a Project
Adicionamos uma nova Classe.
Tiago Santos Coelho
1 – Tipo de item que vamos adicionar, neste caso Class. 2 – Nome que damos ao item Class. Quando carregar-mos em OPEN, do lado esquerdo vai aparecer-nos o item class que adiciona-mos e abre-nos o próprio ficheiro que criamos, como podemos ver na imagem que se segue:
Depois de ter efectuado os passos anteriores, até ao momento temos o projecto criado assim como uma classe para utilizar na criação da conexão à Base de Dados.
Tiago Santos Coelho
Conexão à Base de Dados por gráficos.
Arrastamos o OleDbDataAdapter para o form1 e aparece-nos a configuração Wizard do Data Adapter. Então, NEXT.
Como não temos nenhuma ligação efectuada, então vamos criar uma nova conexão (New Connection...)
Tiago Santos Coelho
Seleccionamos o Tab Fornecedor e os dados aos quais nos pretendemos ligar são os da Microsoft Jet 4.0 OLE DB Provider. Clicar em Seguinte >>
Clicamos no Botão que tem ... e indicamos o caminho da Base de Dados.
Tiago Santos Coelho
Escolhemos a Base de Dados e clicamos em Abrir.
Depois de escolher a Base de Dados testamos a ligação, clicando no botão Testar ligação. Se tudo estiver bem, aparecerá a seguinte mensagem:
Tiago Santos Coelho
Após, clicamos em OK e novamente OK.
Como podemos ver na imagem já possuímos uma ligação à Base de Dados. Então clicamos em NEXT.
Tiago Santos Coelho
NEXT
Aqui escrevemos a instrução SQL ( SELECT * FROM cliente ) como podemos ver na imagem. Clicamos em NEXT.
Tiago Santos Coelho
Automaticamente o Data Adapter Configuration Wizard gerou o DataAdapter com os respectivos SELECT, INSERT, UPDATE, DELETE e Table Mappings. Clica-se em Finish e vai aparecer-nos uma janela em que clicamos em Include Password
Com isto já criamos a ligação à Base de Dados
Tiago Santos Coelho
Após os passos efectuados, obtemos o oleDbDataAdapater1 e o oleDbConnection1. Para obtermos o DataSet, clicamos com o botão direito do rato no oleDbDataAdapter1
Aparece-nos as seguintes opções e escolhemos a que está na imagem seleccionada, ou seja, Generate DataSet.
Tiago Santos Coelho
Escolhemos o nome para o DataSet (que neste caso é DataSet1) e clicamos em OK. Agora iremos apresentar os dados que a base de dados contem, através de um DataGrid.
Selecciona-se a DataGrid (demonstrada na imagem a laranja) e arrastamos para o Fom1. Aí escolhemos o tamanho que queremos que a DataGrid tenha. A DataGrid é uma grelha que nos permite obter a informação de uma ou mais colunas, com as respectivas linhas de uma tabela da Base de Dados. Agora vamos programar para que a DataGrid receba os dados da Base de Dados. Então,
Tiago Santos Coelho
No DataSource (propriedade da DataGrid � lado direito da imagem) escolhemos o dataSet11.cliente que foi o que no passo anterior foi criado a partir do DataSource e .cliente dá indicação da tabela da base de dados. Como podemos visualizar, a DataGrid no Form1, adicionou automaticamente os campos da Base de Dados. Agora para que se preencha a DataGrid com os dados, temos que efectuar mais alguns passos para estar totalmente concluído este processo. O adaptador criado anteriormente deverá ser usado para preencher o DataSet com os dados da tabela. Desta forma, no evento Load() ou no método InitializeComponent() colocamos a seguinte instrução: oleDbDataAdapter1.Fill(dataSet11);
Demonstração do Programa em Execução:
Tiago Santos Coelho
Tiago Santos Coelho
Agora vamos proceder ao acesso à base de dados mas através da criação do código manualmente. Então, criamos um novo projecto:
File > New > Project Isto permite-nos criar um novo projecto. De seguida, escolhemos o tipo de projecto que queremos iniciar, que neste caso vai ser a tecnologia C#, como pode verificar na imagem que se segue.
Legenda: 1 – Tecnologia utilizada para elaborar o projecto. 2 – Tipo de Aplicação. 3 – O nome que damos ao nosso projecto.
Tiago Santos Coelho
4 – Localização do projecto gravado no computador. Após clicar em OK, vai-nos aparecer o seguinte ambiente:
Depois de ter efectuado os passos anteriores, até ao momento temos o projecto criado assim como uma classe para utilizar na criação da conexão à Base de Dados. Agora vamos criar uma estrutura gráfica no From1 para obter os dados da base de dados.
Assim temos os campos que vão receber a informação da Base de Dados, assim como botões <, <<, >>, >, para se movimentar de dado para dado. Agora vamos adicionar um Item class.
Tiago Santos Coelho
Damos o nome cliente à classe.
Tiago Santos Coelho
Vamos obter este código após criar a classe. Agora vamos criar o código para inserir na class cliente:
//em primeiro lugar importamos os namespace necessários: using System; using System.Data; using System.Data.OleDb; namespace Projecto_Teste1 {
public class cliente {
private DataSet dscliente; public cliente() { dscliente = new DataSet(); } public DataSet getcliente() { /criação de ligação à base de dados OleDbConnection oLigar = new OleDbConnection();
//Liga à base de dados através do ficheiro APP.CONFIG oLigar.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\Projecto_Teste1\\Projecto_DB1.mdb;User Id=admin;Password=;";
//criação do adaptador que selecciona todos os dados da tabela fornecedores OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM cliente",oLigar);
//preencher o data set (conjunto de dados) com a tabela que o adaptador foi sacar à base de dados
da.Fill(this.dscliente,"Clientes");
//desliga a conexo com a Base de dados oLigar.Close();
//retorna só os valores da tabela fornecedores return this.dscliente; } } }
Tiago Santos Coelho
De seguida vamos ao Form1 e inserimos após esta linhas de código ( public class Form1 : System.Windows.Forms.Form ) o seguinte código:
//cria o DataSet ao nível do formulário
private DataSet dscliente; De seguida vamos ao INITIALIZE COMPONENTE e adicionamos o seguinte código:
cliente cli = new cliente(); this.dscliente = cli.getcliente(); this.txtnnumero.DataBindings.Add("Text",dscliente.Tables[0],"id"); this.txtnome.DataBindings.Add("Text",dscliente.Tables[0],"nome"); this.txtidade.DataBindings.Add("Text",dscliente.Tables[0],"idade"); this.txtxtelefone.DataBindings.Add("Text",dscliente.Tables[0],"telefone"); this.txttelemovel.DataBindings.Add("Text",dscliente.Tables[0],"telemovel"); this.txtrua.DataBindings.Add("Text",dscliente.Tables[0],"rua"); Agora clicamos em cada botão e adicionamos o código respeitante a cada um. Então obtemos:
Para este botão, clicamos duas vezes no botão e escrevemos este código:
private void btnback_Click(object sender, System.EventArgs e) { this.BindingContext[this.dscliente,"Clientes"].Position -= 1; }
Para este botão, clicamos duas vezes no botão e escrevemos este código:
private void btnnext_Click(object sender, System.EventArgs e) { this.BindingContext[this.dscliente,"Clientes"].Position += 1; }
Para este botão, clicamos duas vezes no botão e escrevemos este código:
private void btnfirst_Click(object sender, System.EventArgs e) { this.BindingContext[this.dscliente,"Clientes"].Position = 0; }
Para este botão, clicamos duas vezes no botão e escrevemos este código:
private void btnlast_Click(object sender, System.EventArgs e) { //indica o numero de empregados que existe int c = this.BindingContext[this.dscliente,"Clientes"].Count; this.BindingContext[this.dscliente,"Clientes"].Position = c; }
Tiago Santos Coelho
Pressione F5 e execute o programa. Como poderá observar conseguimos efectuar a movimentação dos registos através dos botões de direcção, tal como fazíamos no ADO 2.7! Este artigo apenas explora o acesso a dados. Na próxima oportunidade iremos tentar estudar como editar e actualizar os dados de uma base de dados. Qualquer assunto relacionado com este artigo pode ser enviado para [email protected]. Até breve e boa programação. Tiago Coelho…