Você está na página 1de 8

INTRODUO AO MODELO ADO.NET (DESCONECTADO) O modelo ADO.NET (Activex Data Objects .

NET) consiste num conjunto de classes definidas pela .NET framework (localizadas no namespace System.Data) que pode ser utilizado para aceder aos dados armazenados numa base de dados remota. A seguir apresentam-se os principais objectos do modelo desconectado ADO.NET. Dataset
Data Table

.NET Data Provider


Data Adapter

Command

Servidor de BD
Connection BD

O modelo desconectado ADO.NET utiliza dois tipos de objectos para aceder base de dados: os objectos Dataset, que podem conter um ou mais objectos Data Table, e os objectos .NET Data Provider. Um Data Provider representa um conjunto de componentes (DataAdapter, DataReader, Command e Connection) que permite estabelecer a ligao a uma fonte de dados, executar comandos (SQL) e devolver o seu resultado. O objecto Connection possibilita a ligao a uma fonte de dados. O objecto Command permite aceder e manipular a base de dados (representa um comando SQL). O objecto Data Reader permite acesso s de leitura e sequencial base de dados. O objecto Data Adapter serve de ponte entre a base de dados e o objecto Dataset. Para tal, o objecto Data Adapter utiliza objectos Command para executar instrues SQL na base de dados.

O objecto Dataset contm um ou mais objectos Data Table. Assim, os dados que vo alimentar a aplicao esto armazenados neste objecto. O modelo ADO.NET permite trabalhar com cenrios conectados e desconectados, embora tenha sido construdo a pensar, essencialmente, numa arquitectura desconectada. De modo simplista, no cenrio conectado existe permanentemente uma ligao activa base de dados enquanto os dados so manipulados. O anterior modelo ADO foi pensado para uma arquitectura deste gnero, apesar de tambm permitir recorrer tcnica conhecida como disconnected recordset. Basicamente, no modelo desconectado, o objecto Data Adapter utiliza um objecto Command para executar uma instruo SQL (tipicamente um comando Select) para obter os dados. O objecto Command utiliza um objecto Connection para estabelecer uma ligao com a base de dados e obter os dados pretendidos. Depois, o objecto Data Adapter armazena os dados num objecto Data Table do Objecto Dataset. Note-se que, no modelo desconectado, a ligao base de dados apenas permanece aberta durante o tempo necessrio para obter ou alterar os dados da base de dados. Depois, essa ligao fechada e a aplicao trabalha com a cpia dos dados atravs do objecto Dataset. Portanto, os dados armazenados no Dataset so independentes dos dados registados na base de dados. Todavia, as alteraes realizadas sobre os dados existentes no Dataset so posteriormente reflectidas na base de dados. Para actualizar a base de dados com as alteraes efectuadas sobre o Dataset, o objecto Data Adapter utiliza um objecto Command que define um comando Insert, Update ou Delete. Depois, o objecto Command usa um objecto Connection para estabelecer uma ligao com a base de dados e executar a instruo de actualizao. Posteriormente, a ligao fechada. ADO.NET DATA PROVIDERS Todos os objectos do modelo ADO.NET so implementados por classes definidas no espao de nomes (namespace) System.Data da .NET framework. Contudo, as classes especficas utilizadas para implementar os objectos Data Adapter, Command e Connection dependem do Data Provider que utilizado. Actualmente, a .NET framework inclui quatro Data Providers: o SQL Server Data Provider, que foi desenhado para providenciar acesso a servidores SQL Server, o OLE DB Data Provider, que permite aceder a qualquer motor de base de dados que suporte o interface OLE DB, o ODBC .NET Data Provider, que permite aceder a fontes de dados atravs de ODBC, e o .NET Data Provider for Oracle, que permite o acesso a bases de dados Oracle. Adicionalmente a estes quatro Data Providers, existem outros que foram desenvolvidos pelos fabricantes, para permitirem um acesso optimizado s suas bases de dados. Por exemplo, existem Data Providers especficos para servidores MySQL, SQL Anywhere, etc.

Para se poder utilizar um .NET Data Provider, deve-se adicionar, no incio do ficheiro, uma instruo de Import para o espao de nomes apropriado. Caso contrrio, tem que se qualificar cada classe que se refira a estes espaos de nomes, dado que estes espaos de nomes no so includos, por defeito, como referncias. Por exemplo, para utilizar o OLE DB Data Provider pode-se utilizar o seguinte cdigo:
Imports System.Data.OleDb . . Dim cnAlunos As New OleDbConnection()

Ao no utilizar a instruo de Import teria que usar o seguinte cdigo:


Dim cnAlunos As New OleDb.OleDbConnection()

As principais classes includas no OLE DB Data Provider so: OleDbConnection, OleDbCommand, OleDbDataReader e OleDbDataAdapter. A seguir, apresentam-se, resumidamente, as suas principais propriedades e mtodos. Classe OleDbConnection Propriedades Descrio ConnectionString Contm informao que permite estabelecer a ligao a uma base de dados (nome do servidor, nome da base de dados, informao de login). Mtodos Descrio Open Abre uma ligao com uma base de dados. Close Fecha uma ligao com uma base de dados. Notas: A utilizao de um objecto connection passa pela definio de uma string de ligao; pela criao do objecto connection; pela abertura da ligao e pelo fecho da ligao. Existem, essencialmente, duas formas de criar um objecto connection a partir do VS.NET: em design time e em run time. Em design time, ou seja, antes da execuo do cdigo, existem alguns wizards que nos auxiliam na sua criao (DataAdapter Configuration Wizard, Server Explorer, etc.). Em run time, podemos criar um objecto connection do seguinte modo:
Imports System.Data.OleDbClient . .Dim con As New OleDbConnection() Dim constring As String constring = "Provider=""MSDAORA.1""; User ID=abd1; Data Source=arturdb; Password=abd1" Con.ConnectionString = constring Con.Open . Con.Close

Aps a utilizao de um objecto connection extremamente importante que o mesmo seja fechado, pois libertar recursos no s do lado do cliente, como tambm, e sobretudo, do lado do servidor, melhorando assim o desempenho da aplicao. Caso o objecto connection no seja fechado de forma explcita, o garbage collector do VS.NET vai depois tratar da libertao dos respectivos recursos, assim que uma varivel saia do seu mbito (scope). Todavia, no ser prejudicial ao desempenho de uma aplicao a abertura e fecho sistemtico de uma ligao base de dados? Se o objectivo for a criao de uma aplicao para meia dzia de utilizadores em simultneo, ento certamente que uma boa prtica ser a criao da ligao base de dados assim que a aplicao inicia e o seu fecho assim que a aplicao termina. Por outro lado, se a aplicao for construda para funcionar em ambiente distribudo para centenas ou milhares de utilizadores, ento a ligao base de dados deve ser libertada o mais cedo possvel. Note-se que, na prtica, ao invocar o mtodo close(), estaremos apenas fazer uma desactivao da ligao base de dados, para minimizar os recursos utilizados, espera que seja invocada uma nova ligao com as mesmas caractersticas, para reactivar essa ligao (em vez de criar uma nova). A este processo d-se, vulgarmente, o nome de connection pooling (o aspecto chave a reter ser manter a mesma connection string). Classe OleDbCommand Propriedades Connection Descrio O objecto OleDbConnection que utilizado, pelo objecto command, para estabelecer a ligao base de dados. CommandText Comando SQL, nome de um procedimento armazenado ou o nome de uma tabela. CommandType Uma constante que indica se a propriedade CommandText contm um comando SQL (Text), o nome de um procedimento armazenado (StoredProcedure), ou o nome de uma tabela (TableDirect). Parameters A coleco de parmetros do objecto Command. Mtodos Descrio ExecuteReader Executa uma consulta e devolve o resultado na forma de um objecto OleDbDataReader. Por outras palavras, retorna uma referncia a um objecto OleDbDataReader que conter um conjunto de registos devolvidos da base de dados. Para tal, deverse- atribuir a execuo deste mtodo a uma varivel do tipo OleDbDataReader. ExecuteScalar Executa a consulta e devolve, por exemplo, o valor da (primeira) coluna do (primeiro) registo. ExecuteNonQuery Executa o comando e devolve um inteiro que indica o nmero de registos afectados (aconselhado para utilizar com comandos Insert, Update e Delete).

Notas: Quando se utiliza um objecto Data Adapter, a ligao base de dados aberta e fechada de forma automtica. Porm, se a ligao j se encontrar aberta, ter de ser fechada manualmente. tambm possvel utilizar os mtodos do objecto Data Adapter para executar as instrues SQL do objecto Command. Tal como no caso do objecto connection, tambm um objecto command pode ser criado em design time, atravs de um DataAdapter Configuration Wizard ou do Server Explorer, e em run time, do seguinte modo:
. . Dim con As New OleDbConnection() Dim constring As String

Dim cmd As New OleDbCommand() Dim rdr As New OleDbDataReader


. .

cmd.Connection = con cmd.CommandText = Select nome, morada From Clientes cmd.CommandType = CommandType.Text rdr = cmd.ExecuteReader (CommandBehavior.CloseConnection)
. .

Resumindo, o primeiro passo a realizar aps a criao de um objecto command ser associar-lhe um objecto connection. Depois, deve-se indicar o comando (SQL) a executar e o seu tipo. Note-se que, no mtodo Executereader, podemos indicar, atravs de um parmetro (com a instruo CommandBehavior.CloseConnection), que se pretende fechar automaticamente a ligao assim que devolvida a referncia ao objecto OleDbDataReader. Classe OleDbDataAdapter Propriedades SelectCommand DeleteCommand InsertCommand UpdateCommand Mtodos Fill Update Descrio Objecto OleDbCommand que inclui uma instruo Select para consultar a base da dados. Objecto OleDbCommand que inclui uma instruo Delete para eliminar registos da base da dados. Objecto OleDbCommand que inclui uma instruo Insert para adicionar registos base da dados Objecto OleDbCommand que inclui uma instruo Update para alterar registos da base de dados Descrio Executa o objecto Command identificado pela propriedade SelectCommand e regista o resultado num objecto Dataset. Executa os objectos Command identificados pelas propriedades DeleteCommand, InsertCommand e UpdateCommand, por cada

registo do Dataset que tenha sido eliminado, inserido ou alterado. (ver mtodo HasChanges do objecto DataSet. Este mtodo vai verificar a propriedade RowState (Added, Deleted, Modified, Unchanged) de cada registo do DataSet para verificar se foram efectuadas alteraes ao DataSet) Notas: Quando usado o mtodo Fill para obter dados da base de dados, o objecto Data Adapter utiliza um objecto Data Reader para ler os registos do resultado devolvido pela consulta e armazenar esses registos num objecto Dataset. Depois, a aplicao pode trabalhar com os dados do Dataset sem afectar os dados da base de dados. Porm, se a aplicao efectuar alteraes aos dados do Dataset, pode ser utilizado o mtodo Update do objecto Data Adapter para executar os objectos Command identificados pelas propriedades DeleteCommand, InsertCommand e UpdateCommand para registar essas alteraes na base de dados. Quando executado o mtodo Update aberta automaticamente uma ligao. Essa ligao tambm fechada automaticamente quando a actualizao for concluda. Um objecto Data Adapter pode ser criado em design time, atravs de um DataAdapter Configuration Wizard ou do Server Explorer, e em run time, do seguinte modo:
. . Dim dad As New OleDbDataAdapter() Dim con As New OleDbConnection()

Dim cmd As New OleDbCommand()


Dim ds As New OleDbDataset() Dim constring As String . .

cmd.Connection = con cmd.CommandText = Select nome, morada From Clientes cmd.CommandType = CommandType.Text dad.SelectCommand = cmd dad.fill(ds, Clientes) 2. arg (no obrig.) nome da data table do dataset ds
. .

No cdigo anterior os objectos Command e Connection foram criados explicitamente e s depois foram associados ao objecto DataAdapter. Porm, existe ainda a possibilidade de indicar implicitamente qual a instruo Select e qual a ligao base de dados a utilizar pelo objecto DataAdapter:
. . From Clientes, Dim dad As New OleDbDataAdapter(Select nome, morada "Provider=""MSDAORA.1""; User ID=abd1; Data Source=arturdb; Password=abd1")

A grande vantagem de utilizar este mtodo reside no facto de a criao e a destruio dos objectos Command e Connection ser gerida pelo prprio Data Adapter. O primeiro mtodo sobretudo aconselhvel em situaes de reutilizao dos objectos em questo.

Classe OleDbDataReader Propriedades Item FieldCount Mtodos Read Close Descrio Acede coluna com o ndice ou nome especificado do registo actual. Nmero de colunas do registo actual. Descrio L o prximo registo. Devolve True se existirem mais registos. Caso contrrio, devolve False. Fecha o objecto Data Reader.

Note-se que o objecto Data Reader permite ler dados da base de dados, mas no permite modific-los. Por outras palavras o Data Reader um objecto s de leitura. Por outro lado, ele s permite uma leitura sequencial, isto , mal se aceda a um registo, o registo anterior passa a estar inacessvel. O objecto Data Reader s pode ser criado a partir de um objecto Command: Dim cmd As New OleDbCommand() Dim rdr As New OleDbDataReader rdr = cmd.ExecuteReader While (rdr.read()) . . End While rdr.close Note-se ainda que os nomes das classes do .NET OLE DB Data Provider tm o prefixo OleDB. Classe Dataset Um objecto Dataset consiste num repositrio de dados em memria, no lado do cliente, e apresenta-se como o principal representante do conjunto de objectos do modelo ADO.NET a suportar a arquitectura desconectada. Um objecto Dataset nada sabe acerca da fonte de dados de onde provm os seus dados, podendo estes provirem de diferentes bases de dados. Isto acontece porque, o objecto Data Adapter serve de ponte entre o DataSet e a base de dados, pois utiliza a informao de como ligar e aceder base de dados (a partir dos objectos connection e command), ao mesmo tempo que proporciona mtodos para preencher o DataSet de dados, assim como para efectivar a alterao dos dados, realizada ao nvel do DataSet, na fonte de dados. Um objecto Dataset consiste numa hierarquia de um ou mais objectos Data Table e Data Relation.

Um objecto Data Table consiste de um ou mais objectos Data Column, Data Row e Constraint. Um objecto Data Relation define o modo como as tabelas de um objecto Dataset esto relacionadas. O objecto Data Relation essencialmente utilizado para gerir as restries e, desse modo, simplificar a navegao entre tabelas relacionadas. Os objectos Data Column definem os dados em cada coluna da tabela, incluindo o seu nome, tipo de dados, etc. Os objectos Data Row contm os dados para cada registo da tabela. Os objectos Constraint so utilizados para manter a integridade dos dados. Uma restrio de chave primria assegura que os valores numa coluna, tal como a coluna de chave primria, so nicos. Uma restrio de chave forasteira determina como os registos de uma tabela so afectados quando os registos correspondentes duma tabela relacionada so alterados ou eliminados. Note-se que todos os objectos de um Dataset so armazenados em coleces. Por exemplo, os objectos Data Table so armazenados numa coleco de objectos Data Table, e os objectos Data Row so armazenados numa coleco de objectos Data Row. Pode-se aceder a estas coleces atravs das propriedades dos respectivos objectos.